【问题标题】:Background SQLite task后台 SQLite 任务
【发布时间】:2013-10-15 15:17:11
【问题描述】:

在我的应用程序中,我需要从数据库中读取一些数据,因此无论从哪个视图来看,我都会调用另一个包含所有数据库相关方法的类。

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

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 从块传递给方法,然后返回到调用它的视图?

【问题讨论】:

  • 您确定要一次加载所有数据,主线程还是后台?为什么不只加载行的 id,然后在需要时逐步加载批次?
  • @LeoNatan 我没有加载所有数据。实际上只有很少的记录被加载到一个对象中,但是要选择这些记录,我相信查询必须遍历整个表。
  • 你给它的谓词有效地通过数据。但是当您执行“选择 *”时,结果中会返回所有记录数据。您只能请求“rowid”,然后根据这些行 id,在分页中请求数据。
  • @LeoNatan 我不明白您所说的“在分页中请求数据”是什么意思。
  • 例如,当用户滚动表格时,您每次可以获得 50 行。你有行 ID,你有他们的顺序,你只需要加载数据。这样您只下载一小部分 (50) 行,而不是全部 18000。

标签: ios objective-c-blocks


【解决方案1】:

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

- (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;
}

如您所见,我在块外声明了一个块数组,然后将其返回到块外。它正在工作,但这是最好的方法吗?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-09-29
    • 2011-09-15
    • 2013-02-04
    • 2017-10-01
    • 1970-01-01
    • 2020-11-07
    • 1970-01-01
    相关资源
    最近更新 更多