我的代码如下所示,我试图在异步块中调用cpu密集型方法,但该方法并不总是被调用,有时它被调用,有时不会。
-(IBAction) aMethod
//some code
dispatch_async(backgroundQueue, ^{
NSArray *allFiles = [appDel getAllFiles];
totalFilesCount = [allFiles count];
});
//some code
}
backgroundQueue
是在接口文件中声明的实例变量,并使用viewDidLoad
方法创建:
backgroundQueue = dispatch_queue_create("com.myapp.backgroundprocessing", NULL);
方法getAllFiles
有时被调用,有时不被调用(使用断点检查),我将其调用到dispatch_async块的原因是它花了很多时间来返回结果。我的方法看起来有什么问题,它是否应该在主线程中调用,尽管它是cpu密集型方法?
答案 0 :(得分:0)
backgroundQueue = dispatch_queue_create(..., NULL);
创建串行队列,而不是您假设的并发队列。 因此用
调度块dispatch_async(backgroundQueue, ^{ ... });
当分派到该队列的所有先前块都已完成时,执行。 因此,如果第一次调用仍在运行,它可能看起来好像是第二个块 根本没有执行。
要创建并发队列,请使用
backgroundQueue = dispatch_queue_create(..., DISPATCH_QUEUE_CONCURRENT);
但你应该检查你的情况是否有意义再开始
(长时间运行)[appDel getAllFiles]
操作,如果前一个操作仍然是
运行
可能的替代方案是仅启动另一个[appDel getAllFiles]
操作
如果前一个已经完成,并且如果之前的操作没有做任何事情
还在运行这可以做到,例如使用NSOperationQueue
:
if ([opQueue operationCount] == 0) {
[opQueue addOperationWithBlock:^{
NSArray *allFiles = [appDel getAllFiles];
totalFilesCount = [allFiles count];
}];
}