菜鸟教程小白 发表于 2022-12-12 13:26:06

ios - 在 iOS 中使用 NSOperation 实现 AsyncTask


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

<pre><code>-(id)initWithParam:(NSArray *)params{

if (self = ) {

paramsArray = params;
}
return self;

}

- (void)start {

         @autoreleasepool {

   if (self.isCancelled)
      return;
   NSInteger result;

   result = ;

dispatch_async(dispatch_get_main_queue(), ^{

    ;
});
}
}


- (BOOL) doInBackground: (NSArray *) parameters{

   BOOL status = false;
   int i;
for (i=0; i&lt;100000; i++) {
   NSLog(@&#34;printing i::%d&#34;,i);
}
if (i == 100000) {
    status = YES;
}

return status;
}
- (void) postExecute: (BOOL) deviceState{

   if (deviceState) {
      NSLog(@&#34;Finished&#34;);
}

}

-(BOOL)isConcurrent{

   return YES;
}
</code></pre>

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

<p>另外,我什么时候可以在 NSOperation 子类中调用 isExecuting 和 isFinished</p></p>
                                    <br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
                                            <p><p>很遗憾,在回答您的问题时,不,此实现不正确。关闭,但不完全在那里。</p>
<p>有几点:</p>
<ol>
<li><p>你的例子不是并发操作。在 <code>NSOperation</code> 的情况下,术语“并发操作”(现在称为“异步操作”)具有特殊含义。异步操作是即使在 <code>start</code> 方法完成后仍继续异步运行的操作。您可以通过从 <code>isConcurrent</code>(在旧 iOS 版本中)和 <code>isAsynchronous</code>(在现代 iOS 版本中)返回 <code>YES</code> 来指定这一点。但是问题中的示例操作在 <code>start</code> 结束时完全完成,因此不是异步操作,因此 <code>isConcurrent</code> 和 <code>isAsynchronous</code> 应该因此返回<code>否</code>.</p>
<p>假设在本例中您将 <code>isConcurrent</code> 更改为返回 <code>NO</code>,这与您在 <code>start</code> 中执行的操作相符。那将修复此操作。但不要让这让你感到困惑。如果您将此操作添加到您自己的操作队列中,它仍然会相对于主队列异步/并发运行,只是它是一个在 <code>start</code> 完成时自动完成的操作,因此 <code> isAsynchronous</code>/<code>isConcurrent</code> 应该返回 <code>NO</code>。</p>
</li>
<li><p>你问“我什么时候可以调用 <code>isExecuting</code> 和 <code>isFinished</code>?”好吧,您通常不会<em>调用</em>这些方法。您通常<em>实现</em>这些方法。具体来说,当异步操作最终完成时,您必须确保应用 (a) 为 <code>isExecuting</code> 和 <code>isFinished</code> 键发布 KVN; (b) 您覆盖 <code>isExecuting</code> 和 <code>isFinished</code> 以确保它们相应地返回适当的值。</p>
<p>当操作真正是异步/并发操作时,您只需要实现此 <code>isExecuting</code> 和 <code>isFinished</code> 代码。请参阅 <a href="https://developer.apple.com/library/ios/documentation/General/Conceptual/ConcurrencyProgrammingGuide/OperationObjects/OperationObjects.html#//apple_ref/doc/uid/TP40008091-CH101-SW8" rel="noreferrer noopener nofollow">Concurrency Programming Guide: Operation Queues</a> 的<em>为并发执行配置操作</em>部分.另见 <a href="https://developer.apple.com/library/ios/documentation/Cocoa/Reference/NSOperation_class/index.html#//apple_ref/occ/cl/NSOperation" rel="noreferrer noopener nofollow"><code>NSOperation</code> class definition</a> 的介绍部分.</p>
</li>
</ol>
<p>你的操作是否应该是异步的(甚至你是否需要子类<code>NSOperation</code>)还不清楚。这完全取决于您要执行什么任务,以及任务本身是否异步运行。</p></p>
                                   
                                                <p style="font-size: 20px;">关于ios - 在 iOS 中使用 NSOperation 实现 AsyncTask,我们在Stack Overflow上找到一个类似的问题:
                                                        <a href="https://stackoverflow.com/questions/27656607/" rel="noreferrer noopener nofollow" style="color: red;">
                                                                https://stackoverflow.com/questions/27656607/
                                                        </a>
                                                </p>
                                       
页: [1]
查看完整版本: ios - 在 iOS 中使用 NSOperation 实现 AsyncTask