我使用NSOperation子类在iOS中实现了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子类中调用isExecuting和isFinished
答案 0 :(得分:2)
回答你的问题,不幸的是,不,这种实施是不正确的。关闭,但不完全在那里。
有几件事:
您的示例不是并发操作。在NSOperation
的情况下,术语&#34;并发操作&#34; (现在称为&#34;异步操作&#34;)具有特殊含义。异步操作即使在start
方法完成后仍继续以异步方式运行。您可以通过从YES
(旧iOS版本)和isConcurrent
(在当代iOS版本中)返回isAsynchronous
来指定此内容。但问题中的示例操作在start
结束时完全完成,因此不是异步操作,因此isConcurrent
和isAsynchronous
应返回NO
。
我们假设在此示例中您更改了isConcurrent
以返回NO
,这与您在start
中执行的操作相符。这将解决此操作。但不要让这让你感到困惑。如果您将此操作添加到您自己的操作队列中,它仍将相对于主队列异步/并发运行,只是它是在start
完成时自动完成的操作,因此isAsynchronous
/ isConcurrent
应该返回NO
。
您询问&#34;我何时可以致电isExecuting
和isFinished
?&#34;好吧,你通常不会调用这些方法。您通常实施这些方法。具体来说,当异步操作最终完成时,您必须确保app(a)为isExecuting
和isFinished
键发布KVN; (b)覆盖isExecuting
和isFinished
以确保它们相应地返回适当的值。
当操作真正是异步/并发操作时,您只需要实现此isExecuting
和isFinished
代码。请参阅Concurrency Programming Guide: Operation Queues的配置并发执行操作部分。另请参阅NSOperation
class definition。
您的操作是否应该是异步的(或者甚至是否需要子类NSOperation
)尚不清楚。它完全取决于您要执行的任务,以及任务本身是否异步运行。