2012-02-02 4 views
1
에있는 NSData initWithContentsOfURL 취소

나는 현재 키 패스 "의 isCancelled"에 대한 관찰자가있는 NSOperation에 다음 코드가 있습니다는 NSOperation

downloaded = FALSE; 
    NSURL *url = [NSURL URLWithString:requestString]; 
    dataXML = [[NSData alloc] initWithContentsOfURL:url]; 
    downloaded = TRUE; 

observeValueForKeyPath 기능이 dataXML을 취소 할 수 있도록 내가 만들고 싶어를 NSOperation이 취소 메시지를 보내면 NSOperation을 계속하거나 완전히 중지하십시오. NSOperation의 취소 작업 취소는 작업을 중지해야 함을 알리고 작동 코드를 강제로 중지하지 않습니다.

답변

7

취소 할 수 없습니다.

부하 중간 단계를 취소하려면 비동기 모드에서 작동하는 NSURLConnection을 사용하십시오. 설정하는 데 조금 더 시간이 걸리지 만 다운로드 프로세스의 어느 시점에서든 취소 할 수 있습니다.

또는, this handy class 사용할 수 있습니다 내가 비동기 NSURLConnection 단일 메서드 호출 ;-)

NSURLRequest *request = [NSURLRequest requestWithURL:url]; 
[[RequestQueue mainQueue] addRequest:request completionHandler:^(NSURLResponse *response, NSData *data, NSError *error) { 

    if (data && error == nil) 
    { 
     //do something with your downloaded data 
    } 
}]; 

//to cancel the download at any time, just say 
[[RequestQueue mainQueue] cancelRequest:request]; 

쉬운에서의 대리자를 래핑 썼다! 요청이 위에서 이미 비동기이며, 클래스가 이미 당신이 필요가 없습니다, 여러 요청의 대기열을 관리하는 (그리고 안)을 NSOperationQueue에 포장 것을

</shamelessSelfPromotion>

참고.

+0

의미가 있지만, 다운로드가 완료되면 성공 블록 내부에서 별도의 XML 작업을 시작하는 것을 막을 수있는 방법은 없습니다. 방금 NSOperatiom에서 요청을하지 말아야한다는 것을 의미했습니다. 왜냐하면 다른 스레드에서 스레드를 생성하는 것이 자원 낭비이기 때문입니다. mainQueue 공유 인스턴스는 스레드로부터 안전하지 않으므로 가능한 경우 각 NSOperation에 대해 새 RequestQueue 인스턴스를 작성하는 것처럼 로그로 작성할 수 있습니다. –

+0

감사합니다 !!!! 당신의 코드는 정말로 도움이되었습니다 : 저는 TIFF가 거의 500MB (솔직히) 크기이고 이제는 실수로 시작된로드를 취소 할 수 있습니다! 훌륭한. – Todd