FMDatabaseQueue返回结果

时间:2016-02-22 17:46:01

标签: ios objective-c sqlite fmdb

我在我的iOS项目中使用FMDB作为sqlite库。

我所做的是实例化FMDatabase对象并在我的服务中执行所需的查询。例如:

- (NSArray *)getPersons
{
    FMDatabase *db = [self getDatabase];
    [db open];

    NSMutableArray *data = [[NSMutableArray alloc] init];

    FMResultSet *rs = [db executeQuery:@"SELECT * FROM person"];

    while ([rs next]) {
        Person *person = [[Person alloc] init];
        // populate person from result set
        [data addObject:person];
    }

    [db close];

    return [NSArray arrayWithArray:data];
}

但是,最近我被要求调用一些网络服务并将人物图片存储在我的sqlite数据库的base 64中,因为需要在用户离线时显示人物图片。

所以,当我得到WS响应时,我必须遍历数组,获取人物图片,将其转换为base 64并将其存储在我的数据库中。

因为这个proccess(迭代ws结果数组,获取每个人的图像,将其转换为base 64,将它存储在sqlite数据库中)很重,我已经在后台制作了:

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
    // Save persons and persons picture in database
});

它有效...但是因为在后台执行的保存人员块可能需要一些时间,所以我执行此块时运行的每个其他查询都无法正常工作,因为数据库已被锁定。

我一直在读它应该使用FMDatabaseQueue而不是FMDatabase类。但我没有找到任何使用FMDatabaseQueue返回值的示例(即:人员数组)。

另一方面,在FMDatabaseQueue类引用(https://ccgus.github.io/fmdb/html/Classes/FMDatabaseQueue.html)中,它表示类方法是阻塞的,因此它会阻止我的UI,直到我的保存人员块完成。

如何在存储大量数据时避免锁定数据库?

0 个答案:

没有答案