我在我的应用程序中使用NSOperation
子类,它将在一次操作中执行以下4个任务,我希望所有这4个任务在后台线程上运行,因此我将其包含在单个NSOperation
类中,这样我就可以轻松地暂停或取消它
任务
这里每个都必须同步执行,这意味着除了长时间运行计算之外,每个都依赖于另一个。
代码
// MyOperation.h
@interface MyOperation : NSOperation {
}
@property (nonatomic, getter = isCancelled) BOOL cancelled;
@end
// MyOperation.m
@implementation MyOperation
- (void)cancel
{
@synchronized (self)
{
if (!self.cancelled)
{
[self willChangeValueForKey:@"isCancelled"];
self.cancelled = YES;
[webServiceOperation cancel]
[self didChangeValueForKey:@"isCancelled"];
}
}
}
- (void)main {
if ([self isCancelled]) {
NSLog(@"** operation cancelled **");
return;
}
@autoreleasepool{
[self performTasks];
}
}
- (void)performTasks {
[self calculate:^{
if (self.isCancelled)
return;
[self fetchDataFromCoredata:^{
if (self.isCancelled)
return;
//I am using AFNetWorking for updateWebService task so it shall run on separate NSOperation so it would be like nested NSOPeration
webServiceOperation = [self updateWebService:^{
if (self.isCancelled)
return;
[self updateCoreData:^{
if (self.isCancelled)
return;
}];
}];
}];
}];
}
@end
我假设我没有遵循正确的方法,因为当我使用KVO
测试此代码时,NSOperationQueue
会在到达计算完成块之前获得完整通知。
问题
NSOPerationQueue
在完成执行块之前得到完整的通知?提前致谢!期待你的回应
答案 0 :(得分:1)
实际上只有Web调用需要显式异步,因为您的操作已经在后台线程上运行。因此,您可以简化代码中的块结构,因此没有那么多嵌套。
然后你需要正确构造你的操作子类来处理异步内容,如here所述。
答案 1 :(得分:0)
如果你想使用NSOperation,请关注" Wain"回答你需要按顺序处理任务。
您仍然可以使用GCD来使用嵌套块结构并避免使用NSOperation。
答案 2 :(得分:0)
performTasks方法实际上并不执行任何任务。它将任务分派给队列或调用将任务分派给队列的方法。调度完成后,即使任务仍在执行,performTasks也会完成,您的NSOperationQueue会将其视为已完成。
我认为在这里使用NSOperation的理由很充分。只需使用GCD。