核心数据:后台获取,NSFetchedResultsController和排序时间

mon*_*ote 8 sorting background core-data nsfetchedresultscontroller

我遇到的问题如下:

我有一个UITableViewNSFetchedResultsController来自核心数据检索大约6000行的数据.该fetchBatchSizeNSFetchRequest设置为20,如果我没有进行任何NSSortDescriptor的获取是不够快,不会阻塞UI线程.

但是,我确实需要按字母顺序显示那些使用以下NSSortDescriptor的行:

[[[NSSortDescriptor alloc] initWithKey:@"optionText" ascending:YES selector:@selector(localizedCaseInsensitiveCompare:)] autorelease];
Run Code Online (Sandbox Code Playgroud)

现在,当事情发生变化时,获取操作现在需要大约3秒才能完成,因为6000行正在排序.显然,在这几秒钟内,UI被阻止,用户体验非常糟糕.

我知道我可以在后台线程中进行获取,然后将对象ID传递给主线程,但在这种情况下我怎么还能NSFetchedResultsController在主线程中使用它(我也用它来观察数据的变化) ?

我还有indexed我正在排序的属性,但它只优化了查找而不是排序性能.

任何想法将不胜感激,谢谢!

Bob*_*ell 0

首先,NSFetchedResultsController 通常在主线程上使用。并且直到Apple发布iOS 6为止它还不支持后台获取。

所以当你调用NSFetchedResultController的performFectch时,你必须“阻塞”主线程一段时间。然而,我们确实希望时间最短。

(据我所知,您必须为 NSFetchedResultController 设置一个排序描述符。所以我不确定在没有设置排序描述符的情况下如何使其工作。看看类参考)

我不确定你是否使用 Sqlite Store。如果是这样,我简直不敢相信你的排序描述符有效。(请参阅核心数据编程指南:故障排除部分)。如果没有,在内存中保留这么多数据并不是一个好主意

最后我们明白了为什么它很慢。这种使用“localizedCaseInsensitiveCompare:”的排序会使您的获取速度变慢,因为比较 Unicode 字符串会很慢。(WWDC 2010 iPhone 上的核心数据性能中提到)。

与许多其他应用程序一样,您应该根据“optionText”创建一个非 Unicode 字符串字段/属性,并根据该非 Unicode 字符串属性进行排序。