1

UITableView를 만들고 이미지 속성을 설정해야하는 URL 배열이 있습니다. dispatch_async를 사용하여 이미지를 검색하고 강력한 속성으로 선언 한 NSCache에 저장하는 방식으로 테이블의 스크롤 기능을 향상 시켰습니다.하지만 지금은 테이블을 스크롤 할 때 이미지를 볼 수 있습니다. 셀의 이전 행이 표시되고 스크롤이 중지되면 이미지가 업데이트되어야하지만 가끔씩 다른 이미지도 순환합니다. 여기 cellForRowAtIndexPathMethod 내 코드입니다, 왜 이런 일이 일어나는 지 아십니까?테이블 뷰에서 스크롤하는 동안 이미지가 다시로드되는 것을 막는 방법

UIImage* image = [_imageCache objectForKey:article.imageURL]; 
if(image){ 
    [cell.imageRight setImage:image]; 
} else { 
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0ul); 
dispatch_async(queue, ^{ 

UIImage *img = [UIImage imageWithData:[NSData dataWithContentsOfURL:[NSURL URLWithString:article.imageURL]]]; 

dispatch_async(dispatch_get_main_queue(), ^{ 
    [_imageCache setObject:image forKey:article.imageURL]; 
    [cell.imageRight setImage:img]; 
    [cell setNeedsLayout]; 
    }); 
}); 
} 

답변

1

내가 NSOperationQueue를 만들고, 대신 dispatch_async의() 단지 큐의 끝 부분에 블록을 추가합니다.

최대 동시 작업을 1로 설정하면 한 번에 하나의 이미지 만 다운로드되므로 일반 3G 연결보다 성능이 향상됩니다.

각 작업이 수행해야 할 첫 번째 작업은 이미지가 이미 캐시에 있는지 확인한 다음 이미지가 이미 캐시에 있는지 확인하는 것입니다. 그렇게하면 동일한 이미지 다운로드가 대기열에 5,000 번 추가 될 때 처음 다운로드하는 것이므로 중요하지 않습니다.