NSOperationQueue在完成任务之前获得完整通知

时间:2015-01-26 07:47:10

标签: ios objective-c objective-c-blocks nsoperation nsoperationqueue

我在我的应用程序中使用NSOperation子类,它将在一次操作中执行以下4个任务,我希望所有这4个任务在后台线程上运行,因此我将其包含在单个NSOperation类中,这样我就可以轻松地暂停或取消它

任务

  1. 长时间运行计算
  2. 从核心数据中提取数据
  3. 正在更新到服务器
  4. 更新coredata
  5. 这里每个都必须同步执行,这意味着除了长时间运行计算之外,每个都依赖于另一个。

    代码

    // 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会在到达计算完成块之前获得完整通知。

    问题

    1. 我的做法是对的吗?
    2. 如果没有,你能指导我一些正确的方法吗?
    3. 如果是正确的方法那么为什么NSOPerationQueue在完成执行块之前得到完整的通知?
    4. 提前致谢!期待你的回应

3 个答案:

答案 0 :(得分:1)

实际上只有Web调用需要显式异步,因为您的操作已经在后台线程上运行。因此,您可以简化代码中的块结构,因此没有那么多嵌套。

然后你需要正确构造你的操作子类来处理异步内容,如here所述。

答案 1 :(得分:0)

如果你想使用NSOperation,请关注" Wain"回答你需要按顺序处理任务。

您仍然可以使用GCD来使用嵌套块结构并避免使用NSOperation。

NSOperation vs Grand Central Dispatch

答案 2 :(得分:0)

performTasks方法实际上并不执行任何任务。它将任务分派给队列或调用将任务分派给队列的方法。调度完成后,即使任务仍在执行,performTasks也会完成,您的NSOperationQueue会将其视为已完成。

我认为在这里使用NSOperation的理由很充分。只需使用GCD。