• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    迪恩网络公众号

ios - 在 iOS 中使用 NSOperation 实现 AsyncTask

[复制链接]
菜鸟教程小白 发表于 2022-12-12 13:26:06 | 显示全部楼层 |阅读模式 打印 上一主题 下一主题

我在 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/

回复

使用道具 举报

懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关注0

粉丝2

帖子830918

发布主题
阅读排行 更多
广告位

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap