在iOS中使用NSOperation的AsyncTask实现

时间:2014-12-26 11:38:37

标签: ios objective-c nsoperation nsoperationqueue

我使用NSOperation子类在iOS中实现了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子类中调用isExecuting和isFinished

1 个答案:

答案 0 :(得分:2)

回答你的问题,不幸的是,不,这种实施是不正确的。关闭,但不完全在那里。

有几件事:

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

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

  2. 您询问&#34;我何时可以致电isExecutingisFinished?&#34;好吧,你通常不会调用这些方法。您通常实施这些方法。具体来说,当异步操作最终完成时,您必须确保app(a)为isExecutingisFinished键发布KVN; (b)覆盖isExecutingisFinished以确保它们相应地返回适当的值。

    当操作真正是异步/并发操作时,您只需要实现此isExecutingisFinished代码。请参阅Concurrency Programming Guide: Operation Queues配置并发执行操作部分。另请参阅NSOperation class definition

  3. 的介绍部分

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