1

我正在从 Ultralite 数据库中检索 10,000 条记录到一个数组中。

我的查询需要 3 秒将值加载到数组中。每当我单击打开视图控制器时,这会使 UI 冻结 3 秒。

我想在后台执行查询时立即打开视图控制器并显示 Activity 指示器 3 秒。

如果可能的话,我想动态显示行动画并显示行数,例如“检索到的产品数为 5045”。

请问,有人可以帮我解决这个问题吗?

提前致谢。

编辑:

NSMutableArray *customerArray = [[DB sharedInstance] LoadCustomerOverview];

“LoadCustomerOverview”是一个函数,它具有从 Ultrlite 数据库中检索 10,000 条记录的 select 语句。

上面的行需要 3 秒。NSLog我在上述声明之前和之后检查了这一点。使用这个“customerArray”我将填写UITableview我的视图控制器,它只需要几毫秒来准备单元格。

问题在于上面的行。

我怎么解决这个问题?或任何其他提高性能的方法?

提前致谢。

4

5 回答 5

0

解决方案是 performSelectorInBackground,它不会冻结你的 UI

[self performSelectorInBackground:@selector(getRecordsFromDatabase) withObject:yourObjectHereAsArgument]

现在方法:

-(void)getRecordsFromDatabase
{
  //retrieve records here
}
于 2012-10-22T10:25:35.423 回答
0

更新:你使用核心数据吗?如果你批处理怎么办?[fetchRequest setFetchBatchSize:20];

https://developer.apple.com/library/mac/#documentation/Cocoa/Reference/CoreDataFramework/Classes/NSFetchRequest_Class/NSFetchRequest.html

问候,

于 2012-10-22T10:26:09.243 回答
0

接受所有其他好的答案,这可能略有不同,iPhone 设备有(大部分)10-11 和 iPad 设备的两倍(我不知道确切的想法),用户可见的行数在UITableView. 如果您真的不需要一次处理或显示所有 10k 条记录,我认为您真的不需要查询所有记录,因为您提出的问题需要良好的内存和处理时间。相反,您可以一次获取(查询)1k(甚至少量)记录,一旦获得 1k(或您想要的数量),您就可以查询下一条记录,这应该在[self performSelectorInBackground:@selector(getRecordsFromDatabase) withObject:];因此您的应用程序将永远不会冻结并且用户不会感到任何中断,这种情况只有在您的数据是持久的并且具有唯一的行标识符键(主键)时才能实现,而且如果您以升序或降序查询这些数据订单,对于其他情况,例如,如果您想要任何随机数据,则此答案无效。

另请注意,将代码放入viewDidAppear&UIActivityIndicator可能是您的解决方案,但如果您要获取更多的行数,那么它将被用户中断。

于 2012-10-22T12:41:07.230 回答
0

我无法想象你为什么需要 10000 条记录在一个数组中,因为这可能是可以优化的。

但是,要回答您的问题,您可以将加载方法移至 viewDidAppear:(我假设您在 viewDidLoad:) 中进行获取,并在开始加载之前显示某种进度条。

于 2012-10-22T10:18:46.973 回答
0
[NSThread detachNewThreadSelector:@selector(startBackgroundProcess:) toTarget:self withObject:YOUR_OBJECT];

-(void)startBackgroundProcess:(id)obj{
//interact with DB..
//After firing the query and get the Data 
[self performSelectorOnMainThread:@selector(finishedBackgroundProcess:) withObject:YOUR_RESULT waitUntilDone:NO];  
}
于 2012-10-22T10:19:13.467 回答