不调用异步块内的方法

时间:2013-08-18 12:11:53

标签: ios multithreading grand-central-dispatch

我的代码如下所示,我试图在异步块中调用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密集型方法?

1 个答案:

答案 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];
    }];
}