Objective c libsqlite和dispatch\u异步

Objective c libsqlite和dispatch\u异步,objective-c,sqlite,thread-safety,grand-central-dispatch,Objective C,Sqlite,Thread Safety,Grand Central Dispatch,如果libsqlite不是线程安全的,那么就编写这样的代码 dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); __block NSArray *__albumsCollection = albumCollections; dispatch_apply(count, queue, ^(size_t i) { MPMediaItem *albumObj = [[

如果libsqlite不是线程安全的,那么就编写这样的代码

dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);

__block NSArray *__albumsCollection = albumCollections;

dispatch_apply(count, queue, ^(size_t i) 
{ 
   MPMediaItem *albumObj = [[__albumsCollection objectAtIndex:i] representativeItem];

   ///// making some sqlite queries    
});
会引起一个糟糕的执行官

那么,如何使这段代码线程安全呢

我的解决方案是使用主队列

dispatch_apply(count, dispatch_get_main_queue(), ^(size_t i) 
{
   /// my sqllite queries
});

但我对此并不满意。如何使其更好?

不要使用
dispatch\u get\u main\u queue()
获取主队列,您可能希望在非主线程上创建一个单独的队列,如下所示:

dispatch_queue_t queue = dispatch_queue_create("com.example.MyQueue", DISPATCH_QUEUE_SERIAL); // or NULL as last parameter if prior to OS X 10.7/iOS 5.0
dispatch_apply(count, queue, ^(size_t i) {
 /// your SQLite queries
});

或者,您可以使用来自Gus Mueller()brilliant SQLite包装框架的
FMDatabaseQueue
(我就是这么做的):

…将查询块发送到串行调度队列,同步包装其执行

还不确定吗

[queue inTransaction:^(FMDatabase *db, BOOL *rollback) {
    // Your SQLite queries:
    [db executeQuery:@"...", ...];
    ...
}];
现在呢


另外,.

而不是使用
dispatch\u get\u main\u queue()
获取主队列,您可能希望在非主线程上创建一个单独的队列,如下所示:

dispatch_queue_t queue = dispatch_queue_create("com.example.MyQueue", DISPATCH_QUEUE_SERIAL); // or NULL as last parameter if prior to OS X 10.7/iOS 5.0
dispatch_apply(count, queue, ^(size_t i) {
 /// your SQLite queries
});

或者,您可以使用来自Gus Mueller()brilliant SQLite包装框架的
FMDatabaseQueue
(我就是这么做的):

…将查询块发送到串行调度队列,同步包装其执行

还不确定吗

[queue inTransaction:^(FMDatabase *db, BOOL *rollback) {
    // Your SQLite queries:
    [db executeQuery:@"...", ...];
    ...
}];
现在呢


另外,.

是的,除了他可能想要一个串行调度队列,以便一次只运行一个东西。(因为sqlite不能同时从多个线程访问。)所以,他需要在DISPATCH\u QUEUE\u create的第二个参数中传递DISPATCH\u QUEUE\u SERIAL。@JesseRusak:是的,对不起,你是对的;我认为另一种方式是默认的,因为所有的全局队列都是并发的。是的,除了他可能想要一个串行调度队列,以便一次只运行一个东西。(因为sqlite不能同时从多个线程访问。)所以,他需要在DISPATCH\u QUEUE\u create的第二个参数中传递DISPATCH\u QUEUE\u SERIAL。@JesseRusak:是的,对不起,你是对的;我认为另一种方式是默认的,因为所有全局队列都是并发的。