我正在使用NSOperationQueue的addOperationWithBlock。从块内,我如何检查是否应该取消操作?或者访问任何NSOperation属性/方法?
[myOperationQueue addOperationWithBlock: ^{
while ( /* long running loop */ )
{
// how to determine here if I need to cancel?
// for that matter, access any NSOperation properties/methods?
}
}];
使用NSBlockOperation是更好的方法吗?
答案 0 :(得分:50)
更好的解决方案可能是使用NSBlockOperation
并将其添加到队列而不是原始块。你可以这样做:
__block NSBlockOperation *operation = [NSBlockOperation blockOperationWithBlock:^{
while(![operation isCancelled]){
//Some long operation
}
}];
[[self queue] addOperation:operation];
这使您可以使用块,同时可以更好地控制操作...以及更多NSOperation
个细节(例如,添加完成块的功能)。
答案 1 :(得分:2)
如果在一个区块中,你无法真正检查是否需要取消操作。如果它在一个区块中并且它应该被取消则会被取消。无法访问NSOperation属性,因为该块本身不是NSOperation实例。
示例代码:
#import <Foundation/Foundation.h>
int main (int argc, const char * argv[])
{
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
NSOperationQueue *q = [[NSOperationQueue alloc] init];
[q addOperationWithBlock:^{
[NSThread sleepForTimeInterval:10];
NSLog(@"Block 1");
}];
[q addOperationWithBlock:^{
[NSThread sleepForTimeInterval:3];
NSLog(@"Block 2");
}];
[q cancelAllOperations];
[NSThread sleepForTimeInterval:15];
[pool drain];
return 0;
}
如果您删除了cancelAllOperations调用,那么块会像您期望的那样触发。
我建议如果你需要对操作的取消状态进行更精细的控制并与NSOperationQueue相互作用,那么最好使用NSOperation而不是NSBlockOperation。您可以继承NSOperation来完成此任务。