我正在使用NSOperation來執行兩個操作。第一個操作是從Internet加載數據,而第二個操作是更新UI。如何真正取消操作
但是,如果viewDidDisappear函數是由用戶觸發的,我該如何停止數據加載過程? 我試圖
[taskQueue cancellAllOperations],
不過這個功能只作爲抵消,而不是字面上取消執行過程中標誌着一切操作。
任何人都可以請提出一些建議嗎?提前致謝。
我正在使用NSOperation來執行兩個操作。第一個操作是從Internet加載數據,而第二個操作是更新UI。如何真正取消操作
但是,如果viewDidDisappear函數是由用戶觸發的,我該如何停止數據加載過程? 我試圖
[taskQueue cancellAllOperations],
不過這個功能只作爲抵消,而不是字面上取消執行過程中標誌着一切操作。
任何人都可以請提出一些建議嗎?提前致謝。
非常感謝您的回答。但我發現其實
[self performSelectorInBackground:@selector(httpRetrieve) withObject:nil];
解決我的問題。該過程不必取消。感覺像NSOpertaions不在後臺運行。因此,當nsoperation仍在運行時返回到超級導航視圖,UI將會卡住!
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
}
感謝您的回覆。對我有意義。 – xpeng