2015-01-06 6 views
1

서버에서 이미지를 비동기 적으로로드하려고합니다. 그러나 스크롤하는 동안 이미지가 변경되지 않고 스크롤이 중지 된 후에 만 ​​이미지가 변경됩니다. "로드 된"메시지는 스크롤이 중지 된 후에 만 ​​콘솔에 나타납니다. 스크롤하는 동안 이미지가 셀에 나타나길 원합니다.스크롤 할 때 UITableViewCell 업데이트

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 
    CustomCell *cell = (CustomCell *)[_tableView dequeueReusableCellWithIdentifier:@"CustomCell"]; 
    ZTVRequest *request = [[ZTVRequest alloc] init]; 
    [request getSmallImg completionHandler:^(UIImage *img, NSError *error) { 
     if (! error) { 
      NSLog(@"loaded") 
      cell.coverImgView.image = img; 
     } 
    }]; 

    return cell; 
} 
+1

'cell.coverImgView.image = omg;'는 백그라운드 스레드에서 실행중인 것으로 나타나므로 즉시 업데이트되지 않습니다. 'dispatch_async (dispatch_get_main_queue(),^{ cell.coverImgView.image = img; })'와 같은 것을 사용하여 메인 큐에 이미지로드를 디스패치해야한다. 참조 : http://stackoverflow.com/q/4944363/558933 –

+0

도움을받지 못했습니다. 나는 대답을 추가했습니다. – user1561346

답변

1

이미지로드에는 NSURLConnection이 사용됩니다. 나는이 대답에 솔루션을 발견 : 다니엘 Dickison에 의해 https://stackoverflow.com/a/1995318/1561346 여기

이 있습니다 : 스크롤하는 동안, 실행 루프 UITrackingRunLoopMode에 있기 때문에 당신이 스크롤을 중지 할 때까지 연결 위임 메시지가 발사되지 않습니다

이유는 . 기본적으로 NSURLConnection은 자체를 NSDefaultRunLoopMode으로 예약하므로 스크롤하는 동안 메시지가 표시되지 않습니다. 당신을 제안 애플의 문서에 반하는 것 이니셜에 startImmediately:NO을 지정해야

NSURLRequest *request = ... 
NSURLConnection *connection = [[NSURLConnection alloc] 
           initWithRequest:request 
           delegate:self 
           startImmediately:NO]; 
[connection scheduleInRunLoop:[NSRunLoop currentRunLoop] 
      forMode:NSRunLoopCommonModes]; 
[connection start]; 

참고 :

여기 UITrackingRunLoopMode을 포함하는 "일반"모드에서 연결을 예약하는 방법 실행 된 후에도 루프 모드를 변경할 수 있습니다.

관련 문제