2014-02-05 29 views
0

我有一個選擇器,更新我的sqlite(FMDB框架)數據庫fillTopXTraps。 當我調用選擇器更新2個獨立的數據庫時,它在'DataBase'類(簡稱「db」)中失敗。 而且我有這個錯誤:如何阻止選擇器被一次訪問多次?

The FMDatabase is currently in use.

多次。

我試着用打電話fillTopXTraps

[databaseQueue addOperation:invokeOperation]; 
[databaseQueue waitUntilAllOperationsAreFinished]; 

而且我已經出現的錯誤「數據庫被鎖定」和:

[NSOperationQueue addOperations:waitUntilFinished:]: 1 (of 1) operation is finished, executing, or already in a queue, and cannot be enqueued

我嘗試使用FMDatabaseQueue,仍然有一個錯誤「數據庫鎖定「和」...正在使用中「。

我如何確保fillTopXTraps如果它已經被處理並且知道要等到完成然後繼續纔會繼續。 或者,也許問題是顯然從多線程調用的數據庫,我該如何解決它?

+0

您是否使用多個FMDatabaseQueues?您應該只使用每個數據庫一個。 – ccgus

+0

當我需要返回一些值時,我正在使用一個FMDatabaseQueue來更新/插入/刪除和FMDatabase for SELECT語句。 –

回答

0

如果你通過一個串行隊列調度您的更新,他們將在FIFO順序運行:

-(void)serialize:(void (^)(void))task 
{ 
    static dispatch_queue_t serialQueue = NULL; 
    if (!serialQueue) { 
     serialQueue = dispatch_queue_create("com.your.serial.queue", DISPATCH_QUEUE_SERIAL); 
    } 
    dispatch_async(serialQueue, ^{ 
     dispatch_sync(dispatch_get_main_queue(), task); 
    }); 
} 

[self serialize:^{ 
    // database update 
}]; 

注意任務異步運行,但一旦運行,它同步到主隊列。我希望這就是你正在尋找的。

+0

我還在'正在使用'。另一個問題是數據庫調用是在if語句中,而我無法用該塊封裝它。 –

+0

初始化串行隊列不是線程安全的。你最好使用dispatch_once。 – CouchDeveloper

+0

這就是我現在正在嘗試。 –