如何真正取消操作
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就会卡死!
我正在使用 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就会卡死!