我经历了同样的问题。
我切换到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