我在iOS中使用NSOperation子类实现了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 子类中调用 isExecute 和 isFinish
在回答你的问题时,不幸的是,不,这个实现是不正确的。接近,但不是完全在那里。
几件事:
您的示例不是并发操作。在
NSOperation
的情况下,术语"并发操作"(现在称为"异步操作")具有特殊的含义。异步操作是在start
方法完成后仍继续异步运行的操作。您可以通过从isConcurrent
(在较旧的iOS版本中)和isAsynchronous
(在当代iOS版本中)返回YES
来指定这一点。但是问题中的示例操作在start
结束时完全完成,因此不是异步操作,因此isConcurrent
和isAsynchronous
因此应返回NO
。让我们假设在此示例中,您将
isConcurrent
更改为返回NO
,这与您在start
中执行的内容是合适的。这将修复此操作。但不要让这让你感到困惑。如果您将此操作添加到您自己的操作队列中,它仍然会相对于主队列异步/并发运行,只是它是一个在start
完成时自动完成的操作,因此isAsynchronous
/isConcurrent
应该返回NO
。你问"我什么时候可以打电话给
isExecuting
和isFinished
?"好吧,你通常不调用这些方法。通常实现这些方法。具体而言,当异步操作最终完成时,必须确保应用(a) 发布isExecuting
和isFinished
键的 KVN;(b) 覆盖isExecuting
和isFinished
,以确保它们相应地返回适当的值。只需实现此
isExecuting
,并在操作真正是异步/并发操作时isFinished
代码。请参阅并发编程指南:操作队列的配置并发执行的操作部分。另请参阅NSOperation
类定义的介绍部分。
你的操作是否应该是异步的(甚至你是否需要子类NSOperation
)尚不清楚。这完全取决于您要执行的任务,以及任务本身是否异步运行。