后台SQLite任务

时间:2013-10-14 15:24:02

标签: ios objective-c-blocks

在我的应用程序中,我需要从数据库中读取一些数据,因此从任何视图我称之为包含所有与数据库相关的方法的另一个类。

其中一种方法执行如下查询:

query = [NSString stringWithFormat: @"select * from orari where idutente=%d and date(orario)=date('now','localtime') order by orario", idUtente];

然后我用查询中的数据构建一个对象,并将所有对象添加到此方法返回的NSMutableArray中。

我省略了这个方法的所有代码,因为我没有问题并且让问题更清晰。

表“orari”最多可以有18000条记录,我注意到,只需要对大约6000条记录执行该查询,模拟器需要大约4到6秒。所以我考虑在后台队列中执行这个方法,这样主线程就不会被阻塞。

所以我尝试过:

- (NSMutableArray *)NextGroup: (int)opt :(int)id {
    dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
    dispatch_async(queue, ^(void) {
        ....
        here I execute my query, build the objects and add them all to my NSMutableArray
        ....
    });
    return myArray;
}

现在的问题是返回。如果我把它放在dispatch_async块中,我得到错误:“不兼容的块指针类型将'NSMutableArray *(^)(void)'传递给'dispatch_block_t'类型的参数(又名'void(^)(void)')”

如果我把它放在区块之外,它将是空的。

如何将NSMutableArray从块传递给方法,然后返回到调用它的视图?

1 个答案:

答案 0 :(得分:0)

好的,我想我明白了。我只是不确定这是否是最好的方法:

- (NSMutableArray *)NextGroup: (int)opt :(int)id {
__block NSMutableArray *myArray = [NSMutableArray alloc] init];
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_async(queue, ^(void) {
    ....
    here I execute my query, build the objects and add them all to my NSMutableArray
    ....
});
return myArray;
}

如你所见,我在块外面声明了一个块数组,然后将其返回到它之外。它有效,但这是最好的方法吗?