OGeek|极客世界-中国程序员成长平台

标题: ios - 在 iOS 中使用 NSOperation 实现 AsyncTask [打印本页]

作者: 菜鸟教程小白    时间: 2022-12-12 13:26
标题: ios - 在 iOS 中使用 NSOperation 实现 AsyncTask

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

-(id)initWithParamNSArray *)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



Best Answer-推荐答案


很遗憾,在回答您的问题时,不,此实现不正确。关闭,但不完全在那里。

有几点:

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

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

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

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

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

关于ios - 在 iOS 中使用 NSOperation 实现 AsyncTask,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27656607/






欢迎光临 OGeek|极客世界-中国程序员成长平台 (http://ogeek.cn/) Powered by Discuz! X3.4