2012-12-04 43 views
0

我正在使用Apple的懒加载程序代码示例将图像加载到TableView中。由于视图控制器位于导航堆栈中,因此用户可以快速滚动,然后轻按并导航到视图外。 VC是IconDownloader类的一个委托,该类正在执行图像下载,并且我将VC的dealloc中的IconDownloader委托设置为nil。ViewController委托和viewWillDisappear计时问题

但是有一个时间问题,其中滚动委托scrollViewDidEndDecelerating触发,它会触发图像加载,但在我的viewWillDisappear触发之间,但图像加载事件已排队。这会导致视图崩溃时的崩溃,就像委托人一样,但是IconDownloader无论如何都会触发它的委托方法。

所以顺序如下:

  1. scrollViewDidEndDecelerating(它调用loadImagesForOnscreenRows)
  2. viewWillDisappear
  3. 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]; 
} 

回答

0

你取消所有处理下载离开视图控制器是什么时候?

我在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委托。”

+0

是的我在我的viewWillDisappear中取消了所有图像下载(我把它从orig post中取出),但是在loadImagesForOnscreenRows之前仍然会触发,所以新的一批图标会被加载。 – user636066