2015-01-06 3 views
0

크기가 320 X 200 인 UIImageView가있는 셀을 포함하는 UITableView를 사용하는 앱을 개발 중입니다. 이 이미지는 웹 URL에서 가져 와서 내 앱 폴더에 저장합니다. 사용자에게.셀에 이미지가있는 UITableView

"UIImageView + AFNetworking.h"클래스의 아래 메서드를 사용하고 있습니다.

- (void)setImageWithURL:(NSString *)url 
    placeholderImageName:(NSString *)placeholderImage 
      saveFilePath:(NSString *) filePath 
       IndexPath:(NSIndexPath *)indexPath 
       success:(void (^)(NSIndexPath *indexPath, UIImage *image))success 
       failure:(void (^)(NSIndexPath *indexPath, NSError *error))failure { 
    NSLog(@"DOWNLOAD IMG URL :: %@", url); 


    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:[url stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]]]; 
    [request setHTTPShouldHandleCookies:NO]; 
    [request setHTTPShouldUsePipelining:YES]; 
    [request addValue:@"image/*" forHTTPHeaderField:@"Accept"]; 

    [self setImageWithURLRequest:request 
       placeholderImage:placeholderImage == nil? nil : [UIImage imageNamed:placeholderImage] 
         success:^(NSURLRequest *request, NSHTTPURLResponse *response, UIImage *image) { 
          [Storage SaveImage:image WithFileName:filePath]; 
          if (success) 
           success(indexPath, image); 
         } 
         failure:^(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error) { 
          if (failure) 
           failure(indexPath, error); 
         } 
    ];   
} 

이미지를 표시하는 동안 내 모든 이미지가 내 로컬 폴더에 다운로드되면 내 tableview가 멈추었습니다.

+0

그것은 당신이 메인 스레드에서 이미지를 저장하는 날 것으로 보인다. 여기 : [Storage SaveImage : image WithFileName : filePath]; – Ricardo

+0

이 라이브러리를 사용하여 이미지를 다운로드하고 UItableview https://github.com/rs/SDWebImage – nivritgupta

답변

1

다운로드가 주 스레드와 동기화되어 다운로드가 완료 될 때까지 차단할 수 있습니다.

저는 이것을 위해 내 프로젝트에 SDWebImage을 사용합니다. 그것은 정말로 정말로 잘됩니다.

편집 :

OK, AFNetworking는 비동기 적으로 모든 일을하고 또한 모든 이미지를 캐시한다. documentation을 참조하십시오.

성공 및 실패 블록이 필요하지 않은 경우이 문제를 해결할 수 있습니다.

- (void)setImageWithURL:(NSString *)url 
    placeholderImageName:(NSString *)placeholderImage { 

    NSURL *url = [NSURL URLWithString:[url stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]]; 

    UIImage *pImage = placeholderImage == nil? nil : [UIImage imageNamed:placeholderImage]; 
    [self setImageWithURL:url placeholderImage:pImage];   
} 
+0

에 표시합니다. 내 모든 이미지를 다운로드하고 난 그냥 내 애플 리케이션 폴더에서 그것을 보여야 만하더라도 문제가 직면하고있다. –

+0

더 많은 코드가 보일까요? –

+0

나는 코드로 내 질문을 편집했다. –

0

이미지가 매우 큽니다 코드를 볼 수 있습니까? 파일 시스템에서 수동으로로드합니까? 아마 당신이 메인 스레드에서 그렇게하기 때문입니다. 이미지를로드하는 코드에서 이것을 시도하십시오. NSLog (@ "이것은 메인 스레드입니까 : % d", [NSThread isMainThread]); 1이 표시되면 문제가 발생합니다. GCD를 사용하여 문제를 해결할 수 있습니다 (이미지가로드되면 주 스레드로 이동하십시오).

+0

이 문제에 대한 GCD 코드는 무엇입니까? 나는 그것에 대한 경험이 없습니다. –

0

NSOperationQueue를 사용하여 이미지를 다운로드하십시오. NSOperationQueue에 새 항목을 추가하는 동안 먼저 이미 추가되었는지 확인하십시오.

NSOperation이 완료되면 해당 이미지가 로컬로 저장됩니다.

항상 로컬에서 이미지를로드하십시오. 지역에 이미지가 없으면 일부 장소 소유자가 표시됩니다.

희망이 있습니다.

안부, Punita

+0

이 문제의 NSOperationQueue 코드를 얻을 수 있습니까? –

+0

다음은 좋은 예입니다. 1. [고급 문제 : 비동기 UITableViewCell 콘텐츠로드가 올바르게 완료되었습니다.] (http://stavash.wordpress.com/2012/12/14/advanced-issues-asynchronous-uitableviewcell -content-loading-done-right /) 2. [iOS : 이미지를 비동기로 다운로드하는 방법] (http://natashatherobot.com/ios-how-to-download-images-asynchronously-make-uitableview-scroll-fast /) – Punita

+0

또한 다운로드 할 때 이미지 해상도를 확인하십시오. UIImageView가 40 * 40이면 이미지 크기가 80 * 80이어야합니다. 이미지가 80 * 80보다 큰 경우, 스크롤하는 동안 테이블이 멈추거나 큰 이미지를 셀에로드 할 수 있습니다. – Punita

관련 문제