0

我正在使用NSOperation來執行兩個操作。第一個操作是從Internet加載數據,而第二個操作是更新UI。如何真正取消操作

但是,如果viewDidDisappear函數是由用戶觸發的,我該如何停止數據加載過程? 我試圖

[taskQueue cancellAllOperations], 

不過這個功能只作爲抵消,而不是字面上取消執行過程中標誌着一切操作。

任何人都可以請提出一些建議嗎?提前致謝。

回答

0

非常感謝您的回答。但我發現其實

[self performSelectorInBackground:@selector(httpRetrieve) withObject:nil]; 

解決我的問題。該過程不必取消。感覺像NSOpertaions不在後臺運行。因此,當nsoperation仍在運行時返回到超級導航視圖,UI將會卡住!

0

AFAIK,沒有直接的方法來取消已經執行的NSOperation。但是你可以像你在做的那樣取消taskQueue

[taskQueue cancellAllOperations]; 

和操作塊,週期性地(在代碼邏輯原子塊之間)檢查isCancelled,以決定是否繼續進行內部。

NSBlockOperation *loadOp = [[NSBlockOperation alloc]init]; 
__weak NSBlockOperation *weakRefToLoadOp = loadOp; 

[loadOp addExecutionBlock:^{ 
    if (!weakRefToLoadOp.cancelled) { 
     // some atomic block of code 1 
    } 
    if (!weakRefToLoadOp.cancelled) { 
     // some atomic block of code 2 
    } 
    if (!weakRefToLoadOp.cancelled) { 
     // some atomic block of code 3 
    } 
}]; 

NSOperation的塊應仔細劃分爲子塊,這樣,它是安全的停止塊的其餘部分的執行。如果需要,您還應該回滾到目前爲止執行的子塊的效果。

if (!weakRefToLoadOp.cancelled) { 
     // nth sub-block 
    } 
    else { 
     //handle the effects of so-far-executed (n-1) sub-blocks 
    } 
+0

感謝您的回覆。對我有意義。 – xpeng