我的应用程序从 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/