gpt4 book ai didi

ios - 在 iOS 中使用 NSOperation 实现 AsyncTask

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:02:22 25 4
gpt4 key购买 nike

我使用 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

最佳答案

不幸的是,在回答你的问题时,不,这个实现是不正确的。很接近,但还不够。

一些事情:

  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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com