ViewController委派和viewWillDisappear时间问题



我正在使用苹果的懒惰加载程序代码示例将图像加载到TableView中。由于视图控制器在导航堆栈中,用户可以快速滚动,然后点击并导航出视图。VC是IconDownloader类的委托,该类负责图像下载,我在VC dealloc中将IconDownloader委托设置为nil。

然而,有一个时间问题,滚动代理滚动ViewDidEndDecelerating触发,它触发图像加载,但在我的viewWillDisappear之间触发,但图像加载事件已经排队。这会在视图和委托消失时导致崩溃,但IconDownloader无论如何都会激发其委托方法。

因此顺序如下:

  1. scrollViewDidEndDecelerating(调用loadImagesForOnscreenRows)
  2. 视图Will消失
  3. 加载屏幕行的图像

我还在IconDownloader中用responseToSelector而不是nil检查委托状态。

所以我最终在viewWillDisappear中设置了一个bool,并将代理设置为零。然后在loadImagesForOnscreenRows中,我检查bool。我觉得有更好的方法可以做到这一点,但我所读到的一切都表明我正在正确地处理代表。大多数帖子建议不要从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连接DidFinishLoading:中

// 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];
}

离开视图控制器时是否取消所有已处理的下载?

我在dealloc方法中所做的是:

for all iconDownloaders (I have a list of them){
iconDownloader.delegate = nil;
[iconDownloader cancelDownload];
}

其中cancelDownload是iconDownloader类中的方法,类似于

- (void)cancelDownload
{
[self.connection cancel]; //NSURLConnection
self.connection = nil;    
self.receivedData = nil;  //data collected while downloading in NSURLConnection Delegate Methods
}

我使用这个例子进行了小的修改,它对我来说非常好

我同意你评论中的这句话:"大多数帖子建议不要保留IconDownloader的代表。">

相关内容

  • 没有找到相关文章

最新更新