在 iOS 中使用 NSOperation 的 AsyncTask 实现



我在iOS中使用NSOperation子类实现了AsyncTask(Android)。

-(id)initWithParam:(NSArray *)params{
if (self = [super init]) {
paramsArray = params;
}
return self;
}
- (void)start {
         @autoreleasepool {
   if (self.isCancelled)
      return;
   NSInteger result;
   result = [self doInBackground:paramsArray];
dispatch_async(dispatch_get_main_queue(), ^{
    [self postExecute:result];
});
}
}

 - (BOOL) doInBackground: (NSArray *) parameters{
   BOOL status = false;
   int i;
 for (i=0; i<100000; i++) {
     NSLog(@"printing i::%d",i);
 }
 if (i == 100000) {
    status = YES;
 }
return status;
}
- (void) postExecute: (BOOL) deviceState{
   if (deviceState) {
      NSLog(@"Finished");
  }
}
-(BOOL)isConcurrent{
   return YES;
}

这是我在iOS中实现的方式,请建议以及我想为此功能添加的任何内容。

而且,我什么时候可以在 NSOperation 子类中调用 isExecute 和 isFinish

在回答你的问题时,不幸的是,不,这个实现是不正确的。接近,但不是完全在那里。

几件事:

  1. 您的示例不是并发操作。在NSOperation的情况下,术语"并发操作"(现在称为"异步操作")具有特殊的含义。异步操作是在 start 方法完成后仍继续异步运行的操作。您可以通过从isConcurrent(在较旧的iOS版本中)和isAsynchronous(在当代iOS版本中)返回YES来指定这一点。但是问题中的示例操作在start结束时完全完成,因此不是异步操作,因此isConcurrentisAsynchronous因此应返回NO

    让我们假设在此示例中,您将isConcurrent更改为返回 NO ,这与您在 start 中执行的内容是合适的。这将修复此操作。但不要让这让你感到困惑。如果您将此操作添加到您自己的操作队列中,它仍然会相对于主队列异步/并发运行,只是它是一个在start完成时自动完成的操作,因此isAsynchronous/isConcurrent应该返回NO

  2. 你问"我什么时候可以打电话给isExecutingisFinished?"好吧,你通常不调用这些方法。通常实现这些方法。具体而言,当异步操作最终完成时,必须确保应用(a) 发布isExecutingisFinished键的 KVN;(b) 覆盖isExecutingisFinished,以确保它们相应地返回适当的值。

    只需实现此isExecuting,并在操作真正是异步/并发操作时isFinished代码。请参阅并发编程指南:操作队列的配置并发执行的操作部分。另请参阅 NSOperation 类定义的介绍部分。

你的操作是否应该是异步的(甚至你是否需要子类NSOperation)尚不清楚。这完全取决于您要执行的任务,以及任务本身是否异步运行。

最新更新