2012-09-09 2 views
1

많은 주제를 살펴 보았지만 여전히 파악할 수 없습니다.그랜드 센트럴 디스패치보기 전환

나는 온라인으로 콘텐츠를 다운로드하는 UITableview를 보유하고 있습니다. 각 셀에는 이미지가 있고 GCD를 사용하여 이미지를 다운로드합니다. 다운로드 한 이미지는 디스크에 저장되며 셀이로드 될 때마다 파일이 이미 존재하는지 확인합니다 (그렇지 않으면 -> gcd, nsdata 등).

누군가 인터넷에 연결되어 있으면 잘됩니다. wifi). 그러나 만약 내가보기 흉한 3G 연결로 앞뒤로 훑어 보려한다면, 대기열 (약 4 셀)을 끝내기를 원하지만 이미 새 것을 할당 받게됩니다. , 새로운 하나, 새로운 하나 그리고 결국 사용자는 실제 UITableview가 채워지기 전에 다른 것들이 실행되기 전에 (그가 보지 않는) looong 시간을 기다려야한다. NSLog를 사용하면 다른 뷰에서도 화면에서 볼 수있는 uiimages를 다운로드하고 만들 수 있습니다. 각 작업은 약 100kb이며, 느린 (또는 심지어 인터넷 연결이 없습니까?) 당신은 많은 시간이 걸릴 수 있습니다.

나는 그것을 취소 할 수 없다는 것을 알고 있지만, 나는 BOOL 변수를 사용하는 것에 관한 다른 주제를 읽었지만 실제로 얻지는 못한다. 사용자가 화면을 떠날 때 BOOL 변수가 변경 되더라도 셀은 이미 대기열에 있습니다.

사용자가 NavigationController에서 뒤로 버튼을 탭하여보기를 나가면 큐의 블록이 비어있는 데이터를 변경하여 다운로드 할 필요가 없으며 블록이 될 수 있습니까? 바로 실행됩니다 (할 일이 없습니다). 그래서 배열 뉴스의 모든 가치를 무언가처럼 만드는 것이 좋을까요? 데이터 소스를 변경할 수 있습니까, 아니면 대기중인 블록이 기다리는 동안 대기중인 블록에 이미 데이터 소스가 있습니까?

또 다른 문제가 있습니다. 현재 실행중인 블록에는 영향을 미치지 않습니다.

누군가 좋은 방향으로 나를 가리킬 수 있습니까?

감사합니다.

Prastow

+1

다음과 같이 요약합니다 : 'UITableView'의 대표 모델을 웹 서비스로 채우고 있습니다. 사용자가 상세보기로 이동할 때 다운로드 대기열을 취소하거나 일시 중지하려고합니다. 이 올바른지? – FluffulousChimp

+0

uitableview는 텍스트 및 이미지 (뉴스 피드)가 포함 된 온라인 XML 파일에서 채워집니다. 하지만 이미지가 커지면 비동기로 처리해야합니다. 사용자가 다시 돌아 왔을 때 gcd를 일시 중지하고 싶습니다. 따라서 detailview는 아니지만 메인 메뉴로 되돌아갑니다. – Prastow

답변

0

나는 그것은 나에게 가장 좋은 부분을했습니다 내가 다시 잠시 개발 한 응용 프로그램과 유사한 문제에 직면하고 필요로하며, 더 모든 것을 할 수있는 가장 좋은 방법은, https://github.com/MugunthKumar/MKNetworkKit

를 사용하는 것으로 나타났습니다 하루의 전환을 배우고 이해하고, 내가 필요로하는 것을 정확히 조정하기 위해 며칠 더 걸릴 것입니다.

당신이 그것을 사용하거나 기능의 철저한 개요를하고자 결정했다면

당신은 취소 해 다운로드 작업을 생성 할 NSBlockOperationNSOperationQueue를 사용할 수있다 여기 http://blog.mugunthkumar.com/products/ios-framework-introducing-mknetworkkit/

+0

특히 온라인 xml에서 제공되는 뉴스 피드 용 비동기 이미지를 다운로드 할 때 중부 파견에 대한 많은 주제와 자습서를 볼 수 있습니다. 이 권리에 대한 해결책이 있어야합니까? – Prastow

+0

아마 거기 있지만 mknetworkkit 당신에게 모든 것을 제공하고 자동 이미지/thumnail 캐싱 및 로딩을 제공합니다. 진행 표시 및 블록 기반 실행을 모두 무료로 다운로드/업로드하십시오! 원래 2/3까지 작성한 네트워크 코드를 잘라내어 몇 줄의 간단한 요청을 처리 할 수 ​​있습니다. –

1

시작합니다. 일부 작업을 수행하는 블록을 제공하여 NSBlockOperation을 만듭니다. 귀하의 경우 블록은 URL의 내용을 다운로드합니다.

보기 컨트롤러에서 대기열에 제출 된 작업 목록을 저장합니다. 사용자가 현재보기를 종료하기로 결정한 경우 불필요한 작업을 방지하기 위해 보류중인 각 작업에 cancel으로 전화 할 수 있습니다. 그러나 현재 실행중인 작업은 완료 될 때까지 실행됩니다. 현재 실행중인 작업을 취소하려면 작업을 수행하는 블록에 NSOperation 객체에 대한 약한 참조를 저장해야합니다. 그런 다음 블록 본문 내의 적절한 간격으로 작업이 취소되었는지 조기에 확인하십시오.

// Create a queue on which to run the downloads 
NSOperationQueue* queue = [NSOperationQueue new]; 

// Create an operation without any work to do 
NSBlockOperation* downloadImageOperation = [NSBlockOperation new]; 

// Make a weak reference to the operation. This is used to check if the operation 
// has been cancelled from within the block 
__weak NSBlockOperation* operation = downloadImageOperation; 

// The url from which to download the image 
NSURL* imageURL = [NSURL URLWithString:@"http://www.someaddress.com/image.png"]; 

// Give the operation some work to do 
[downloadImageOperation addExecutionBlock: ^() { 
    // Download the image 
    NSData* imageData = [NSData dataWithContentsOfURL:imageURL]; 

    // Make sure the operation was not cancelled whilst the download was in progress 
    if (operation.isCancelled) { 
     return; 
    } 

    // Do something with the image 
}]; 

// Schedule the download by adding the download operation to the queue 
[queue addOperation:imageDownloadOperation]; 

// As necessary 
// Cancel the operation if it is not already running 
[imageDownloadOperation cancel]; 

올해 정확한 WWDC에서 "iOS의 동시 사용자 인터페이스 구현"이라는 제목의 저서가 나왔습니다. 당신은 비디오와 슬라이드를 찾을 수 있습니다. here

+0

이 방법을 시도했지만 작동하지 않습니다. 우선 Xcode는 코드가 올바르지 않다고 말했지만이를 수정했습니다. 그러나 여전히, downloadImageOperation.executionblock 후에 아무 일도 일어나지 않습니다 ?? NSLog를 거기에 넣었지만 보여주지는 않습니다. – Prastow

+0

코드에 버그를 수정했으며 Xcode의 샘플 애플리케이션으로 테스트했습니다. 이제는 효과가있다. –

+0

"자동 변수에 __weak 속성을 지정할 수 없습니다"및 "선언되지 않은 식별자 imageDownloadOperation 사용"오류가 발생합니다. 이 코드를 내 cellForRowAtIndexPath에 넣었습니다. 괜찮습니까? – Prastow

관련 문제