如何真正取消操作

How to genuinely cancel operations

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

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

[taskQueue cancellAllOperations], 

但是这个函数只是把里面的每一个操作都标记为已取消,并没有真正取消正在执行的过程。

谁能给些建议吗?提前致谢。

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
    }

衷心感谢您的回答。但我发现实际上

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

解决我的问题。该过程不必取消。感觉 NSOpertaions 不在后台 运行。这样,nsoperation还在运行的时候返回超级导航视图,UI就会卡死!