免費開源的iOS開發學習平臺

FMDB:3-線程安全(FMDatabaseQueue)

在使用FMDB時,不要創建一個單例數據庫,然后在多個線程中使用。如果堅持要這么做,系統最終會崩潰會拋出一個異常。如果一定要在多個線程中使用,可以在每個線程中創建一個FMDatabase對象。另外,還有一個更好的方法就是使用FMDatabaseQueue類。用戶可以生成一個FMDatabaseQueue單例,然后在多線程中使用它,FMDatabaseQueue會負責同步和協調多線程。

首先來創建一個FMDatabaseQueue隊列。

FMDatabaseQueue *queue = [FMDatabaseQueue databaseQueueWithPath:aPath];

然后這樣使用它:

[queue inDatabase:^(FMDatabase *db) {
    [db executeUpdate:@"INSERT INTO myTable VALUES (?)", @1];
    [db executeUpdate:@"INSERT INTO myTable VALUES (?)", @2];
    [db executeUpdate:@"INSERT INTO myTable VALUES (?)", @3];

    FMResultSet *rs = [db executeQuery:@"select * from foo"];
    while ([rs next]) {
        …
    }
}];

簡單包裝成事務的用法如下:

[queue inTransaction:^(FMDatabase *db, BOOL *rollback) {
    [db executeUpdate:@"INSERT INTO myTable VALUES (?)", @1];
    [db executeUpdate:@"INSERT INTO myTable VALUES (?)", @2];
    [db executeUpdate:@"INSERT INTO myTable VALUES (?)", @3];

    if (whoopsSomethingWrongHappened) {
        *rollback = YES;
        return;
    }
    // etc…
    [db executeUpdate:@"INSERT INTO myTable VALUES (?)", @4];
}];

日韩av 中文字幕 1_亚洲第一区在线_亚洲V日韩V精品v无码专区_色鬼久久亚洲AV综合