我有自定义委托/协议设置。我使用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。就在它调用委托时,它永远不会将对象传递回视图控制器。设置断点表明它永远不会传回数据。
我之前在代理/协议的其他项目中使用了这个完全相同的模式,并且从未遇到过问题。任何想法为什么没有被调用?
答案 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() { }
。这样你就不会意外地从文件外部创建它的实例。 -