我經歷了同樣的問題。
我切換到FMDatabaseQueue
每一個數據庫查詢/更新我不得不這樣做。它像一個魅力!
使用performSelectorOnMainThread
是一個好主意,但實際編碼時,傳遞參數並獲得結果供進一步使用可能非常棘手。
編輯:這裏是一個小例子
-(void) updateTaskStateAsync:(NSNumber *)taskID withNewStatus:(NSNumber *)state andCompletionBlock:(void(^)(BOOL status))completionBlock{
NSString *errInfo = [NSString stringWithFormat:@"taskID %d - state %d", [taskID intValue], [state intValue]];
[queue inDatabase:^(FMDatabase *db) {
BOOL r = [db executeUpdate:@"UPDATE tasks SET state=?, date_job_last_updated=? WHERE identifier=?", state, [NSDate dateWithTimeIntervalSinceNow:0], taskID];
DB_DISPLAY_ERROR(errInfo); // convenient macro to log errors
if(completionBlock)
completionBlock(r);
}];
}
-(BOOL) updateTaskStateSync:(NSNumber *)taskID withNewStatus:(NSNumber *)state {
NSString *errInfo = [NSString stringWithFormat:@"taskID %d - state %d", [taskID intValue], [state intValue]];
__block BOOL r = NO;
__block BOOL ended = NO;
[queue inDatabase:^(FMDatabase *db) {
r = [db executeUpdate:@"UPDATE tasks SET state=?, date_job_last_updated=? WHERE identifier=?", state, [NSDate dateWithTimeIntervalSinceNow:0], taskID];
DB_DISPLAY_ERROR(errInfo); // convenient macro to log errors
ended = YES;
}];
NSCondition *cond = [[NSCondition alloc] init];
[cond lock];
while(!ended)
[cond wait];
[cond unlock];
return r;
}
我想要做的和你一樣,但對於FMDatabaseQueue查詢,其結果必然是迴歸異步.....是不是很方便。你有什麼建議嗎? – flypig 2012-08-20 14:38:18
實際上我沒有這個問題。我編輯了我的答案以添加一段代碼,如果它沒有幫助,請附上。 – dvkch 2012-08-21 07:50:37
塊代碼由fmdb Queue異步執行,並且在代碼執行時r會在塊中更新,但是隻需返回程序的最後一行中的r ....我想你會得到空的查詢結果有時取決於fmdb隊列狀態。這嚴重地混淆了我好幾天..可能是我們應該通過完成塊返回查詢結果,如「(BOOL)updateTaskState:(NSNumber *)taskID withNewStatus:(NSNumber *)state completion:(void(^)(BOOL r))completion;」並在[queue inDatabase:^(FMDatabase *)中調用completion(r) db){..}]塊。 – flypig 2012-08-21 20:35:22