Apple의 지연 시간 코드 예제를 사용하여 TableView에 이미지를로드하고 있습니다. 뷰 컨트롤러가 탐색 스택에 있으므로 사용자는 빠르게 스크롤 한 다음 뒤로 탭하여 뷰 밖으로 이동할 수 있습니다. VC는 IconDownloader 클래스의 델리게이트이며, 이미지 다운로드를하는 클래스이며 VC dealloc에서 IconDownloader 대리자를 nil로 설정합니다.ViewController delegate 및 viewWillDisappear 타이밍 문제
그러나 스크롤 위임자 scrollViewDidEndDecelerating이 발생하는데 이미지로드가 발생하지만 내 viewWillDisappear가 실행되지만 이미지로드 이벤트가 이미 대기열에있는 경우 타이밍 문제가 있습니다. 델리게이트처럼 뷰가 사라짐에 따라 크래시가 발생하지만 IconDownloader는 델리게이트 메소드를 실행합니다.
그래서 순서는 다음과 같다 : (loadImagesForOnscreenRows를 호출)
- scrollViewDidEndDecelerating
- viewWillDisappear
- 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];
}
예 내 viewWillDisappear에서 cancelAllImageDownloads가 있습니다. (원래 게시물에서 가져 왔습니다)하지만 여전히 loadImagesForOnscreenRows 전에 실행되므로 새 아이콘 배치가로드됩니다. – user636066