2015年6月22日 星期一

利用closure的特性來解決callback時間差的問題

如果你要更新你的cell,但你的cell是reuse的,那第一時間用url去抓的image,可能在你滑動的過程中,callback回來時cell已經改放其他的data了。
原本我是想在download image的callback中加入一個key(在下例中是userName)來比對是否跟目前cell的userName相同,但這麼一來,就會破壞了download image API的內聚性。

在swift中比較好的做法是利用closure的特性來解決callback時間差的問題,
closure會把參數copy一份出來,而用self.去接的則是將外部的參數call by reference,
於是我們比較userName == self?.userName 就會等於是比較目前的跟之前的變數差異。
這樣就解決了。

    func setData(displayName: String, userName: String) {
        self.userName = userName
        
        WebImageFetcher.sharedInstance.getImageWithDisplayId(userName, size: ImageSizeEnum.SIZE_96X) {
            [weak self] (data) in
            if let img = data {
                if userName == self?.userName {
                    self?.iconView.image = data
                }
            }
        }
    }

沒有留言:

張貼留言