很多关于GCD和串行队列的混淆

时间:2013-10-18 21:19:14

标签: ios multithreading queue grand-central-dispatch

我的应用程序从SQLite DB中执行了大量的写入/读取操作,我希望它能够在另一个线程上执行所有这些操作,以便不阻止主线程。 但是所有这些数据库操作都必须一个接一个地执行,否则它将无法工作。

根据我的理解,我应该使用一个串行队列,并将所有任务添加到它。 如果是这样,如何创建一个全局串行队列并从我所在的任何视图添加任务?

或许我根本没有得到它,所以我需要有人指出我正确的方向。 感谢。

3 个答案:

答案 0 :(得分:4)

正如 Ashley Mills 建议的那样,您可以创建GCD队列:

dispatch_queue_t queue = dispatch_queue_create("SQLSerialQueue", DISPATCH_QUEUE_SERIAL);
dispatch_async(queue, ^{
    // ...
});

但另一种选择是使用NSOperationQueue,我更喜欢:

NSOperationQueue *queue = [[NSOperationQueue alloc] init];
queue.maxConcurrentOperationCount = 1;
queue.name = @"SQLSerialQueue";
[queue addOperationWithBlock:^{
    // ...
}];

NSOperationQueues构建在GCD队列之上,允许您等待运行操作完成(类似于将异步任务转换为同步)。 您还可以为经常执行的任务创建NSOperation的子类,并将它们轻松添加到队列中。

NSOperationQueues的另一个优点是类方法+currentQueue,在GCD环境中几乎无法访问。

另一方面,NSOperationQueue缺少GCD中的障碍操作。最后,所有差异都可以在其他框架中实现,但只需要做一些或多的工作。


如果你决定使用GCD但不喜欢它的C接口,请检查我的Objective-C包装器:Grand Object Dispatch;)

答案 1 :(得分:3)

创建串行队列所需要做的就是:

dispatch_queue_t myQueue = dispatch_queue_create("myqueue", DISPATCH_QUEUE_SERIAL);

或许可以看一下使用myQueue作为属性的单例对象,可以从应用程序的任何位置访问。

答案 2 :(得分:1)

根据我自己的经验,您不希望在没有使用框架为您处理数据库的情况下尝试将数据库访问过多。我建议调查FMDatabaseQueue