2017-11-21 10 views
1

UIPageViewController 클래스가 있는데 여기에서 모든 이미지 URL (nTempElements)을 수집하고 이미지로드가 발생하는 ContentViewController에 전달합니다. 사용자가 뒤로 또는 앞으로 스크롤 할 때 스크롤 된 페이지 이미지가로드 될 때까지 항상 첫 번째 viewcontroller 이미지를 자리 표시 자로 표시합니다.UIPageViewController 전환 도중 이미지로드 중

ContentViewController에서 dispatch_async을 제거하면이 문제는 더 이상 유효하지 않지만 이미지로드가 주 스레드에서 발생하므로이 문제는 터치 이벤트에 덜 반응합니다.

이 문제점에 대한 권장 사항이나 해결책은 무엇입니까?

PageContentViewController.m

- (PageContentViewController *)viewControllerAtIndex:(NSUInteger)index 
{  
    if (([self.nTempElements count] == 0) || (index >= [self.nTempElements count])) { 
     return nil; 
    } 

    // Create a new view controller and pass suitable data. 
    PageContentViewController *pageContentViewController = [self.storyboard instantiateViewControllerWithIdentifier:@"ContentViewController"]; 
    pageContentViewController.imageURL = self.nTempElements[index]; 
    return pageContentViewController; 
} 

ContentViewController.m

- (void)viewDidLoad { 
    [super viewDidLoad]; 

    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ 
     NSURL *url = [NSURL URLWithString:self.imageURL]; 
     NSData *data = [NSData dataWithContentsOfURL:url]; 
     UIImage* image = [[UIImage alloc]initWithData:data]; 

     dispatch_async(dispatch_get_main_queue(), ^{ 
      [self.newsImageView setImage:image]; 
     }); 
    }); 
} 
+0

'pageContentViewController'를 초기화 한 후에 이미지로드 이후를 제외하고 어디에서나'setImage'를 호출하는 것을 볼 수 없습니다. 'pageContentViewController'는 어떻게 첫 번째 viewcontroller 이미지를 보여줄 수 있습니까? 다른 곳에서는'newsImageView'에 대한 이미지를 설정 했습니까? – trungduc

+0

이미 다운로드 한 이미지를 캐시하지 않는 이유는 무엇입니까? AlamofireImage와 같은 타사 라이브러리를 찾아 보거나 SDWebImage가 여기에 도움을 줄 수 있습니다. –

답변

0

이 코드에 따라 도움이 될 수있다!

NSURLSessionTask *task = [[NSURLSession sharedSession] dataTaskWithURL:self.imageURL completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) { 
    if (data) { 
     UIImage *image = [UIImage imageWithData:data]; 
     if (image) { 
      dispatch_async(dispatch_get_main_queue(), ^{ 

        self.newsImageView.image = image; 
      }); 
     } 
    } 
}]; 
[task resume];