2012-02-02 22 views
1

我現在有在一個對的keyPath「isCancelled」進行觀察的的NSOperation下面的代碼:取消的NSData initWithContentsOfURL中的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]; 

易代表!

</shamelessSelfPromotion>

需要注意的是上面的要求已經是異步的,而類已經管理的多個請求排隊,所以你不需要(也不應該)在NSOperationQueue包裹。

+0

這很有道理,但是一旦下載完成,沒有什麼能夠阻止您從成功塊內部單獨執行XML操作。我的意思是你不應該在你的NSOperatiom中自己做請求,因爲從另一個線程中產生一個線程只是浪費資源。雖然如果你願意,可以像日誌一樣爲每個NSOperation創建一個新的RequestQueue實例,因爲mainQueue共享實例不是線程安全的。 – 2012-02-02 18:31:11

+0

謝謝!!!!你的代碼真的幫了我很大的忙:我有TIFF的尺寸接近500MB(老實說),現在我可以取消錯誤啓動的加載!輝煌。 – Todd 2012-11-26 22:31:47

相關問題