2013-08-18 54 views
0

我使用FMDB sqllite包裝(https://github.com/ccgus/fmdb),我很期待這個代碼從多個線程中執行一些代碼。因此,我使用FMDatabaseQueue類來執行所有數據庫工作。FMDB排隊 - 這個模式是如何正確實現的?

我由圖案,例如糊塗一點點

FMDatabaseQueue *q = [FMDatabaseQueue databaseQueueWithPath:@""]; 
[q inDatabase:^(FMDatabase *db) { 
    NSLog(@"1"); 
    BOOL yn = [db executeUpdate:@"CREATE TABLE IF NOT EXISTS Foo (Bar TEXT)"]; 
    NSLog(@"2%@", yn ? @"YES" : @"NO"); 
}]; 
NSLog(@"3"); 

如果你看一下上面的代碼..它保證這3將始終爲2和1日後登錄?這樣正在執行的線程被阻塞,直到提供給隊列的塊實際執行爲止?

如果是這樣,我應該去掉外面和塊,使使用隊列中的任何其他線程都不能阻止的工作,不需要進行線程之間的同步後的任何非數據庫工作?

而且,做我需要調用[db open]使用FMDatabaseQueue什麼時候?

回答

1

是的,它是保證3將在1和2

這是因爲FMDatabaseQueue -inDatabase:使用dispatch_sync調用內部做數據庫操作(你可以在source code看到)被記錄。

因此,建議是做塊內的工作少可能,做你自己的隊列中的所有其他工作。

而且,不需要[db open],因爲FMDatabaseQueue -initWithPath:(被稱爲FMDatabaseQueue +databaseQueueWithPath:)已經做那個(如再次,你可以在source code看到)。

+0

謝謝。我猜測一個人不應該從FMDatabase隊列中排隊另一個塊,然後呢? +感謝指向代碼的指針! – ConfusedNoob

+0

一個問題 - 我應該塊內環路上的FMResultSet還是確定要傳遞出來的塊(不知道是否有隱藏的智慧清理在塊結束的任何東西) – ConfusedNoob

+1

你需要做的塊內循環。 – ccgus