2012-12-15 25 views
0

如果libsqlite不是線程像libsqlite和dispatch_async

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

安全代碼將提高BAD_EXEC。

那麼如何使這個代碼線程安全的?

我的解決辦法是使用主隊列

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

但我並不感到滿意。如何讓它變得更好?

回答

4

而不是使用dispatch_get_main_queue()讓主隊列的你可能想在非主線程創建一個單獨的private dispatch 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 
}); 

另外,您可以使用來自格斯穆勒的一個FMDatabaseQueue@ccgus)輝煌FMDB SQLite的包裝框架(這是我會怎麼做):

FMDatabaseQueue *queue = [FMDatabaseQueue databaseQueueWithPath:aPath]; 

[queue inDatabase:^(FMDatabase *db) { 

    // Your SQLite queries: 
    [db executeQuery:@"...", ...]; 
    ... 

}]; 

... WHI ch會將你的查詢塊發送到一個串行調度隊列,並同步執行它的執行。

不相信嗎?

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

現在怎麼樣?

此外,custom-defined block-based SQLite functions

+0

是的,除了他可能想串行調度隊列,以便只有一件事的時間運行。 (由於sqlite的,不能從多個線程同時訪問。)所以,他需要通過DISPATCH_QUEUE_SERIAL在dispatch_queue_create的第二個參數。 –

+0

@JesseRusak:[「與DISPATCH_QUEUE_SERIAL或NULL創建調度隊列屬性調用塊串聯以FIFO的順序。」](https://developer.apple.com/library/mac/#documentation/Performance/Reference/GCD_libdispatch_Ref/Reference /reference.html) – Regexident

+0

是的,對不起,你是對的;我認爲另一種方式是默認的,因爲所有的全局隊列是併發的。 –

0
dispatch_queue_t q=dispatch_queue_create("name", NULL); 
dispatch_sync(q, ^{ 
//your code is here 
}); 

dispatch_async(dispatch_get_main_queue(), ^(void) { 
//as soon as above block is completed, this block executed and you will be notified that  
//work is completed 

});