我正在使用 Apple 的惰性加载器代码示例将图像加载到 TableView 中。由于视图控制器位于导航堆栈中,因此用户可以快速滚动,然后点击返回并导航出视图。VC 是 IconDownloader 类的委托,该类执行图像下载,并且我在 VC dealloc 中将 IconDownloader 委托设置为 nil。
但是有一个计时问题,滚动委托 scrollViewDidEndDecelerating 触发,它触发图像加载,但在我的 viewWillDisappear 触发之间,但图像加载事件已经排队。当视图消失时,这会导致崩溃,委托也是如此,但 IconDownloader 无论如何都会触发其委托方法。
所以顺序如下:
- scrollViewDidEndDecelerating(调用 loadImagesForOnscreenRows)
- 视图将消失
- loadImagesForOnscreenRows
我还在使用 respondsToSelector 而不是 nil 检查 IconDownloader 中的委托状态。
所以我最终在 viewWillDisappear 中设置了一个布尔值,并将委托设置为 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];
}