我正在使用Apple的懶加載程序代碼示例將圖像加載到TableView中。由於視圖控制器位於導航堆棧中,因此用戶可以快速滾動,然後輕按並導航到視圖外。 VC是IconDownloader類的一個委託,該類正在執行圖像下載,並且我將VC的dealloc中的IconDownloader委託設置爲nil。ViewController委託和viewWillDisappear計時問題
但是有一個時間問題,其中滾動委託scrollViewDidEndDecelerating觸發,它會觸發圖像加載,但在我的viewWillDisappear觸發之間,但圖像加載事件已排隊。這會導致視圖崩潰時的崩潰,就像委託人一樣,但是IconDownloader無論如何都會觸發它的委託方法。
所以順序如下:
- scrollViewDidEndDecelerating(它調用loadImagesForOnscreenRows)
- viewWillDisappear
- loadImagesForOnscreenRows
我還檢查與respondsToSelector而不是零在IconDownloader委託狀態。
所以我最終在viewWillDisappear中設置了一個bool,並將委託設置爲nil。然後在loadImagesForOnscreenRows我檢查布爾。我覺得有一個更好的方法來做到這一點,但我讀過的所有內容都表明我正確地處理了委託。大多數帖子建議不保留來自IconDownloader的委託。只是想知道別人怎麼看這個解決方案。謝謝!
代碼:
- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView
{
[self loadImagesForOnscreenRows];
}
- (void)loadImagesForOnscreenRows
{
if ([self.entries count] > 0 && !viewIsDisappearing)
{
...
}
}
- (void)viewWillDisappear:(BOOL)animated {
[super viewWillDisappear:animated];
viewIsDisappearing = TRUE;
self.iconDownloader.delegate = nil;
}
和IconDownloader NSURL connectionDidFinishLoading:
// call our delegate and tell it that our icon is ready for display
if (self.delegate != nil && [self.delegate respondsToSelector:@selector(appImageDidLoad:)])
{
[delegate appImageDidLoad:self.indexPathInTableView];
}
是的我在我的viewWillDisappear中取消了所有圖像下載(我把它從orig post中取出),但是在loadImagesForOnscreenRows之前仍然會觸發,所以新的一批圖標會被加載。 – user636066