如何真正取消操作

时间:2015-04-06 21:18:06

标签: nsoperation nsoperationqueue kill-process dispatch-async networkonmainthread

我使用NSOperation执行两项操作。第一个操作是从Internet加载数据,而第二个操作是更新UI。

但是,如果viewDidDisappear函数是由用户触发的,我该如何停止数据加载过程? 我试过了

[taskQueue cancellAllOperations], 

但是此函数仅将内部的每个操作都标记为已取消,而不是逐字取消执行过程。

有人可以提出一些建议吗?在此先感谢。

2 个答案:

答案 0 :(得分: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
    }

答案 1 :(得分:0)

真诚地感谢您的回答。但我发现实际上

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

解决我的问题。这个过程不必取消。感觉就像NSOpertaions没有在后台运行。因此,当nsoperation仍在运行时,回到超级导航视图,UI将被卡住!