代表没有打电话

时间:2016-01-21 21:37:25

标签: ios swift delegates alamofire

我有自定义委托/协议设置。我使用alamofire发出get请求,然后解析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 {

         }
      }

   }

}

所有这一切都正常 - getGallery()函数中的print语句按预期打印出每个URL。就在它调用委托时,它永远不会将对象传递回视图控制器。设置断点表明它永远不会传回数据。

我之前在代理/协议的其他项目中使用了这个完全相同的模式,并且从未遇到过问题。任何想法为什么没有被调用?

1 个答案:

答案 0 :(得分: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所指出的那样:

为了避免将来出现这种混淆,您可以标记ImgurAPIManager初始值设定项private: private init() { }。这样你就不会意外地从文件外部创建它的实例。 -