ios - 很多关于 GCD 和串行队列的困惑

标签 ios multithreading queue grand-central-dispatch

我的应用程序从 SQLite 数据库中执行大量写入/读取操作,我希望它在另一个线程上执行所有这些操作,这样主线程就不会被阻塞。 但是所有这些数据库操作都必须一个接一个地执行,否则是行不通的。

据我了解,我应该使用串行队列,并将所有任务添加到其中。 如果是这样,如何创建全局串行队列并从我所在的任何 View 向其添加任务?

或者也许我根本没弄明白,所以我需要有人给我指出正确的方向。 谢谢。

最佳答案

正如 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 中的barrier 操作。最后,所有差异都可以在其他框架中实现,但需要做一些或更多的工作。


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

关于ios - 很多关于 GCD 和串行队列的困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19459212/

相关文章:

c++ - 加载队列而不是列表

.net - 如何从另一个线程阻止 UI 线程或强制表单在 UI 线程内运行

java - 在 Java FutureTask 中,如果任务超时,任务是否会被取消?

c - 有谁知道我的 C 程序的这种奇怪输出是如何发生的?

ios - 找不到插件,或者不是 CDVPlugin。检查 config.xml 中的插件映射

c++ - 在 C++ 中,获取/释放原子访问与宽松访问与栅栏相结合之间是否存在任何有效区别?

c++ - 在 C++ 中创建一个标准的指针队列

ios - tvOS 应用内存问题 : How to resolve it?

ios - 滚动后的单元格在图像上显示图像

ios - Couchbase lite ios 检索文件