문제는
그래서 작업이 비동기로의 빠르고 스크롤하면 1 개 셀에 대해이 작업을 파견하게됩니다 예를
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
UITableViewCell *cell = [self.tableView dequeueReusableCellWithIdentifier:@"YourCellId"];
cell.image = nil;
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), ^{
UIImage *image = [self imageForIndexPathRow:@(indexPath.row)];
dispatch_async(dispatch_get_main_queue(), ^{
cell.image = image;
});
});
return cell;
}
을 보자, 세포가 재사용된다는 것입니다.
예를 들어 이름에 일부 셀 포인터 "ImageCell-1"을 지정하십시오.
빠른 스크롤을 시작하면 2 가지 작업이 전달됩니다.
첫 번째 작업이 "a.png"를로드하고 다운로드가 활성화되면 빠르게 스크롤하고 "ImageCell-1"이 (가) "b.png"로로드됩니다 ("a.png"는 아직로드 중입니다).
그래서 "a.png"가 다운로드를 완료하고 "ImageCell-1"로 설정되면 "b.png"를 완료하고 "ImageCell-1"로 설정됩니다.
(이 문제는 => "빠르게 스크롤하면 비슷한 문제가 나타날 수 있습니다.로드해야하는 최종 이미지로 바꾸기 전에 셀에서 매우 빠르게 변화하는 이미지를 볼 수 있습니다.")
또한 AFNetworking과 같은 "고급 라이브러리"를 사용할 때 대기열을 관리하고 동시성 다운로드를 사용할 수 있습니다. "b.png"가 다운로드를 완료하고이를 "ImageCell- 1 "을 입력하면"a.png "다운로드가 완료되고"ImageCell-1 "로 설정됩니다. 그러면 "b.png"대신 "a.png"가 표시됩니다.
해결책은 AFNetworking을 사용하는 경우 새 작업을 시작하기 전에 다운로드 작업을 취소하고 NSOperations를 유지하고 새 다운로드를 시작하기 전에 [operation cancelOperation];
으로 전화하는 것입니다.
편집 :
이있는 NSURLConnection을 사용하는 경우 NSURLSession를 사용하는 현대적인 방법으로 전환해야 (요청 취소를 지원합니다).여기
나는이
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
UITableViewCell *cell = [self.tableView dequeueReusableCellWithIdentifier:@"YourCellId"];
[cell loadImageFromPath:imagePath availableCache:self.cache];
return cell;
}
감사합니다. 문제를 잘 설명했지만 해결 방법이 분명하지 않습니다. 새 작업을 시작하기 전에 한 작업을 취소하면 일반 작업에 심각한 문제가 발생합니다. 그래서 프로그램이 시작될 때 셀 1 2 3 4를로드하려고 시도하는 것보다 보이지만 1이 시작될 때 2가 오면 취소하는 것보다 더 큽니까 ?? 나에게 명확하지 않다. 그리고 그런데, 나는 AFNetworking을 사용하지 않는다. 나는 그것을 좋아하지 않는다. 나는 당신이 다른 질문에서 나를 준 대답과 같은 이미지를로드한다 .. – Curnelious
그리고 그런데, 나는 그 문제가 다른 것보다 설명 될 수 있다고 생각한다. 나는 같은 세포에 대해 2 가지 조작이 있다고 생각하지 않는다. 나는 내가 올라갈 때, 예를 들어 셀 6이 이미지 다운로드를 시작한다고 생각한다. cell6이 1 (재사용)이되고 6에서 이미지를 볼 때보 다. AFNetworking을 사용하지 않는다면 어떻게 될까? 너는 그 문제를 돌봐 줄거야? – Curnelious
더 좋은 해결책은 스크롤러가 감속 할 때만 이미지를로드하는 것입니다. 데이터에 저역 통과 필터를 사용하는 것보다 좋습니다. – Curnelious