문제

좋아, 난 있어요 UITableView 관습으로 UITableViewCell각각은 a를 포함합니다 UIImageView 그의 이미지는 an을 통해 비동기 적으로 다운로드되고 있습니다 NSURLConnection. 모든 꽤 표준적인 것들 ...

문제는 테이블 스크롤이있을 때 새로운 이미지가 백그라운드에서 올바르게 다운로드되지만 테이블이 움직이지 않을 때까지 렌더링되지 않습니다.

이동 중에도 콘텐츠를 렌더링하도록 테이블을 어떻게 얻습니까? 감사.

-- 업데이트 --

자세히 살펴본 후, 나는 그것을 찾고 있습니다 NSURLConnection 테이블이 스크롤을 멈출 때까지 대의원 방법이 발사되지 않습니다. 이유가 확실하지 않습니다. 어떤 도움이든 좋을 것입니다.

도움이 되었습니까?

해결책

스크롤링을 중지 할 때까지 연결 대의원 메시지가 발생하지 않는 이유는 스크롤 중에 실행 루프가 UITrackingRunLoopMode. 기본적으로, NSURLConnection 일정 자체 NSDefaultRunLoopMode 스크롤하는 동안 메시지가 없습니다.

다음은 "공통"모드에서 연결을 예약하는 방법은 다음과 같습니다. UITrackingRunLoopMode:

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

지정해야합니다 startImmediately:NO 이니셜 라이저에서는 Apple의 문서에 대응하는 것으로 보이는 런 루프 모드가 시작된 후에도 런 루프 모드를 변경할 수 있음을 시사합니다.

다른 팁

NSRUNLOOP에서 읽어야합니다. 스크롤 중에 런 루프가 nseventTrackingRunLoopMode에서 실행 중이며 NSURLConnection이 해당 모드에 포함되지 않은 것으로 생각됩니다. NSURLConnection의 ScheduleInRunLoop : Formode :, 스크롤 중에 다운로드가 발생할 수 있습니다.

이것은 아마도 스크롤 성능에 영향을 미칠 것입니다. 이는 아마도 처음부터 별도의 실행 루프 모드의 이유 일 것입니다. 그러나 그것을 시도하고 그것이 어떻게 느끼는지 확인하십시오!

NSOperation에서 이미지 다운로드 및 업데이트를 래핑하면 테이블 뷰 스크롤로 업데이트가 발생합니다.

NSOperation의 또 다른 이점은 셀이 화면에서 미끄러 져서 작업을 취소 할 수 있다는 것입니다. 사용자에게 훨씬 더 반응하는 느낌이들 것입니다. 특히 긴 목록을 빠르게 스크롤하면 빠르게 스크롤하면됩니다. 올해 Apple Tech-Talk는이 기술을 장려했습니다.

목록이 그렇게 길지 않거나 계속로드를 선호하는 경우 대신 NSOperation 우선 순위를 조작 할 수 있습니다.

첫째 ... 당신의 연결은 아마도 Mainrunloop에 도달 할 때까지 시작되지 않을 것입니다. 그곳에서 스크롤 애니메이션도 처리되는 곳입니다.

나는 같은 문제에 부딪쳐서 이미지가 생성되면 즉시 이미지가 시작되도록 연결을 지시함으로써 그것을 수정했습니다.

    NSURLConnection *connection = [[NSURLConnection alloc] initWithRequest:wrapper.request delegate:wrapper];

    [connection start];

이미지를 수신하고 cell.imageview.image를 수신 이미지로 설정하는 완료 루틴 에서이 셀이 현재 테이블에 표시되는 셀 중 하나에 속하는지 확인해야합니다. TableView ReloadData].

    NSInteger itemIndex = theIndexInTheRowDataOfTheCellYouStuffedTheImage

    NSArray *indicies = [_tableView indexPathsForVisibleRows];
    NSUInteger rows = indicies.count;

    if (rows > 0 &&
        itemIndex >= ((NSIndexPath *)[indicies objectAtIndex:0]).row &&
        itemIndex <= ((NSIndexPath *)[indicies objectAtIndex:rows - 1]).row)
    {       
        [_tableView reloadData];
    }
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top