Objective c libsqlite和dispatch\u异步
如果libsqlite不是线程安全的,那么就编写这样的代码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 = [[
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:是的,对不起,你是对的;我认为另一种方式是默认的,因为所有全局队列都是并发的。