0

我的代码如下所示,我试图在异步块内调用 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 密集型方法,但是否应该在主线程中调用它?

4

1 回答 1

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];
    }];
}
于 2013-08-18T12:47:34.443 回答