我在 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
很遗憾,在回答您的问题时,不,此实现不正确。关闭,但不完全在那里。
有几点:
你的例子不是并发操作。在 NSOperation
的情况下,术语“并发操作”(现在称为“异步操作”)具有特殊含义。异步操作是即使在 start
方法完成后仍继续异步运行的操作。您可以通过从 isConcurrent
(在旧 iOS 版本中)和 isAsynchronous
(在现代 iOS 版本中)返回 YES
来指定这一点。但是问题中的示例操作在 start
结束时完全完成,因此不是异步操作,因此 isConcurrent
和 isAsynchronous
应该因此返回否
.
假设在本例中您将 isConcurrent
更改为返回 NO
,这与您在 start
中执行的操作相符。那将修复此操作。但不要让这让你感到困惑。如果您将此操作添加到您自己的操作队列中,它仍然会相对于主队列异步/并发运行,只是它是一个在 start
完成时自动完成的操作,因此 isAsynchronous
/isConcurrent
应该返回 NO
。
你问“我什么时候可以调用 isExecuting
和 isFinished
?”好吧,您通常不会调用这些方法。您通常实现这些方法。具体来说,当异步操作最终完成时,您必须确保应用 (a) 为 isExecuting
和 isFinished
键发布 KVN; (b) 您覆盖 isExecuting
和 isFinished
以确保它们相应地返回适当的值。
当操作真正是异步/并发操作时,您只需要实现此 isExecuting
和 isFinished
代码。请参阅 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 |