2012-12-04 37 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