2012-04-15 3 views
0

이미지를 UITableView (GCD)에 비동기 적으로로드하고 하나의 이미지에 셀을 고정하기 전에 셀이 여러 이미지를 통해 "셔터"되는 이상한 동작을보고 있습니다. 말로 표현하기가 어렵 기 때문에 스크린 레코딩을 만들었습니다. 주어진 셀에 대해 하나의 이미지에 고정되기 전에 여러 이미지가 이동하는 것을 볼 수 있습니다. UITableView 비동기 이미지 여러 이미지를 통한 셔터로드

http://www.youtube.com/watch?v=PKuqng81QX4

난 (a REST 엔드 포인트로부터) 이미지를 가져 오지 큐를 사용하고, 다음 메인 큐 셀의 이미지를 설정.

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 

// ..after getting the cell: 

    dispatch_queue_t imageQ = dispatch_queue_create("imageQ", NULL); 
    dispatch_async(imageQ, ^{ 
     NSString *galleryTinyImageUrl = someFunctionToGetThumbnailUrl; 
     NSData *imageData = [[NSData alloc] initWithContentsOfURL:[NSURL URLWithString:galleryTinyImageUrl]]; 
     dispatch_async(dispatch_get_main_queue(), ^{ 
      cell.imageView.image = [UIImage imageWithData:imageData]; 
      [tableView reloadRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationNone]; 
     }); 
    }); 
    dispatch_release(imageQ); 

이가 (해고 이러한 세포 이미지가로드의 30 트리거, 테이블에 즉, 사용자의 제스처를) 짧은 시간에 여러 번 호출지고 있다는 사실은인지 나에게 문제가 발생합니다 여기에 코드입니다 모든 비동기 쓰레드는 안전하게 "착륙"할 수 있습니다. 내가 보는 행동 (비디오에서)은 내가 여기서 잘못된 것을하고 있음을 증명하는 것으로 보인다. 네가 가지고있는 구체적인 제안이나 폭 넓은 제안 제안을 고맙게 생각한다.

도움 주셔서 감사합니다.

답변

2

세포 재사용을 올바르게 구현하지 않은 것 같습니다. [tableView dequeueReusableCellWithIdentifier:blah]을 통해 셀을 다시 사용할 때 새 이미지가 완전히 다운로드되어 표시 될 준비가 될 때까지 셀 이미지를 nil으로 설정해야합니다.

또한 셀을 재사용 할 때 이전에로드 된 이미지의로드가 느려지므로 실제로 실행중인 이미지 요청을 취소하여 실제 셀을 덮어 쓰지 않도록하십시오.

+0

감사합니다. 새로운/재사용 셀을 가져 오는 것 바로 아래에'cell.imageView.image = nil; '을 추가하고 그것을 고쳤습니다! – Steven

+0

다행 당신을 도울 수 있어요. –

+0

루프에서 이미지를 다운로드하지 않으려면 어떻게해야합니까? – mikezang

관련 문제