ViewController 委托和 viewWillDisappear 计时问题

Posted

技术标签:

【中文标题】ViewController 委托和 viewWillDisappear 计时问题【英文标题】:ViewController delegate and viewWillDisappear timing issue 【发布时间】:2012-12-04 21:52:02 【问题描述】:

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

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

所以顺序如下:

    scrollViewDidEndDecelerating(调用 loadImagesForOnscreenRows) viewWillDisappear 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];

【问题讨论】:

【参考方案1】:

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

我在 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

我用这个例子做了一些小的修改,它对我来说非常好。

我同意你们 cmets 的这句话: “大多数帖子建议不要保留 IconDownloader 的委托。”

【讨论】:

是的,我的 viewWillDisappear 中有 cancelAllImageDownloads(我从原始帖子中取出),但它仍然会在 loadImagesForOnscreenRows 之前触发,因此会加载新一批图标。

以上是关于ViewController 委托和 viewWillDisappear 计时问题的主要内容,如果未能解决你的问题,请参考以下文章

ViewController 委托和 viewWillDisappear 计时问题

ViewController 委托问题

1 个 ViewController 和 2 个 modalViews 委托

如何在 ViewController 之间传递委托

从 UIWebView 委托呈现 ViewController

无法使用 mapKit 从 ViewController 将坐标发送到具有委托的另一个 viewController