2012-12-04 4 views
0

Apple의 지연 시간 코드 예제를 사용하여 TableView에 이미지를로드하고 있습니다. 뷰 컨트롤러가 탐색 스택에 있으므로 사용자는 빠르게 스크롤 한 다음 뒤로 탭하여 뷰 밖으로 이동할 수 있습니다. VC는 IconDownloader 클래스의 델리게이트이며, 이미지 다운로드를하는 클래스이며 VC dealloc에서 IconDownloader 대리자를 nil로 설정합니다.ViewController delegate 및 viewWillDisappear 타이밍 문제

그러나 스크롤 위임자 scrollViewDidEndDecelerating이 발생하는데 이미지로드가 발생하지만 내 viewWillDisappear가 실행되지만 이미지로드 이벤트가 이미 대기열에있는 경우 타이밍 문제가 있습니다. 델리게이트처럼 뷰가 사라짐에 따라 크래시가 발생하지만 IconDownloader는 델리게이트 메소드를 실행합니다.

그래서 순서는 다음과 같다 : (loadImagesForOnscreenRows를 호출)

  1. scrollViewDidEndDecelerating
  2. viewWillDisappear
  3. loadImagesForOnscreenRows

나는 또한 respondsToSelector하지 전무와 IconDownloader의 위임 상태를 확인하고 있습니다 .

그래서 viewWillDisappear에서 bool을 설정하고 대리자를 nil로 설정했습니다. 그런 다음 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 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 
} 

I 사용자 약간만 수정이 예와는 완벽하게 잘 작동합니다 나를.

그리고 나는 귀하의 의견에이 문장에 동의합니다 : "대부분의 게시물은 IconDownloader의 대리인을 보유하지 않을 것을 권장합니다."

+0

예 내 viewWillDisappear에서 cancelAllImageDownloads가 있습니다. (원래 게시물에서 가져 왔습니다)하지만 여전히 loadImagesForOnscreenRows 전에 실행되므로 새 아이콘 배치가로드됩니다. – user636066