2016-01-21 43 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非常好的一点 –