0

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

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

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

4

3 回答 3

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 ;)

于 2013-10-18T21:46:50.583 回答
3

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

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

或许可以考虑使用单例对象,该对象具有myQueue可以从应用程序中的任何位置访问的属性。

于 2013-10-18T21:25:31.773 回答
1

根据我自己的经验,您不希望在不使用框架为您处理的情况下尝试过多地对数据库访问进行线程化。我建议调查FMDatabaseQueue

于 2013-10-19T03:57:31.963 回答