2016-01-21 39 views
2

我有一個自定義的委託/協議設置。我使用alamofire來獲取請求,然後解析json。 json被安排到Swift對象中,並傳遞迴集合視圖控制器。除了將它們發回的委託從未被調用。其他的一切都很完美。這裏是我的相關代碼:代表不叫

class ViewController: UICollectionViewController, MainCatGallery { 

var cats = [Cats]() 
let theManager = ImgurAPIManager() 

override func viewDidLoad() { 
    super.viewDidLoad() 
    loadCats() 
    theManager.delegate = self 

} 

    func gotCatsArray(x: [Cats]) { 
     self.cats = x 
     self.collectionView?.reloadData() 
    } 
} 

和:

protocol MainCatGallery { 
func gotCatsArray(x: [Cats]) 
} 


class ImgurAPIManager: NSObject { 

static let sharedInstance = ImgurAPIManager() 
let jsonClass = ParseJson() 
var delegate:MainCatGallery? 
var catGallery = [Cats]() 

func getGallery() { 
    Alamofire.request(Router.Get) 
    .response { (request, response, data, error) -> Void in 
     do { 
      let jsonDict = try NSJSONSerialization.JSONObjectWithData(data!, options: NSJSONReadingOptions.MutableContainers) 
      self.catGallery = self.jsonClass.parseCatGalleryJson(jsonDict) 
      for x in self.catGallery { 
       print(x.url!) 
      } 
      self.delegate?.gotCatsArray(self.catGallery) 

     } 
     catch { 

     } 
     } 

    } 

} 

所有這一切工作正常 - 預期print語句在getGallery()函數打印出每個URL。就在它調用委託時,它永遠不會將對象傳遞迴視圖控制器。並且設置斷點表明它永遠不會傳回數據。

我在代表/協議的其他項目中使用過這個完全相同的模式,並且從來沒有遇到過問題。任何想法爲什麼它沒有被召喚?

+1

何時何地你叫'getGallery'?調用'loadCats()'時它是否被視圖控制器調用? –

+0

您正在創建ImgurAPIManager的新實例並將其委託給它。請使用您的sharedInstance設置委託或使您的委託保持靜態。 –

+0

@Roman yes loadCats()調用get gallery方法,但DanBeaulieu已經正確回答。 ImgurAPIManager.sharedInstance.delegate = self是正確的。把它放在答案中,我會接受它。 – joey

回答

2

在您的ImgurAPIManager類中,您有一個共享實例,您可以使用它來設置委託。

static let sharedInstance = ImgurAPIManager() 

然而,在你的ViewController您已經創建了一個新的實例並設置委託:

let theManager = ImgurAPIManager() 

override func viewDidLoad() { 
    super.viewDidLoad() 
    theManager.delegate = self 
} 

改變這一行:

theManager.delegate = self 

要這樣:

ImgurAPIManager.sharedInstance.delegate = self 

由於Roman Sausarnes指出如下:

而要避免這種對未來的mixup的,你可以標記您ImgurAPIManager初始化private: private init() { }。這樣你就不會在文件外意外地創建它的實例。 -

+2

爲了避免將來出現這種混淆,你可以標記你的'ImgurAPIManager'初始化'private':'private init(){}'。這樣你就不會在文件外意外地創建它的實例。 –

+0

@RomanSausarnes非常好的一點 –