gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 18:06:00 24 4
gpt4 key购买 nike

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

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com