核心数据:中断执行NSFetchRequest

mcl*_*lin 9 iphone search core-data

一直在搜索高低:

在Core Data中,有没有办法中断/停止/取消和执行NSFetchRequest?

我执行在iPhone应用程序的渐进式搜索,我尝试了优化它的各种方式,但它是不够的(我有42000条记录),所以我要在的NSOperation运行.键入新字符时,我需要取消之前的fetchRequest,但[nsoperation cancel]不执行任何操作.

另一种方法可能是将我正在搜索的字段移动到其他可中断的索引中,可能在内存中,或者可能是一个单独的sqlite3数据库,它似乎可以用sqlite_interrupt中断.

Mar*_*rra 14

你问题的直接答案是否定的.您最好的选择,当前的设计是在操作中执行它们,但是您有线程障碍可以担心并减慢您的速度.请记住,如果您的操作未在主线程上运行,那么您需要单独NSManagedObjectContext执行操作,否则您将遇到线程问题.

更好的问题:你为什么要为每个角色做一个新的获取?

如果您已经拥有先前搜索的获取结果且用户未删除字符,则只需获取现有结果并针对该字符运行谓词NSArray.这将进一步细化搜索,而不是每次都进入磁盘.因为它在内存中会非常快.

实现搜索字段时,请考虑以下选项:

  • 仅在第一个字符上点击磁盘
  • 仅在从搜索框中删除字符时才能点击磁盘
  • 考虑预加载objectID和searchable属性以避免磁盘命中.

根据您正在搜索的内容(以及有多种方法可以重新规范Core Data存储以改进搜索),您可以在内存中预加载相当多的内容.即使有42K记录,如果搜索属性足够小,您也可以将它们全部加载到内存中.

如果用户按"A"开始,您仍然需要测试该用例.

什么部分NSFetchRequest是慢的?点击SQLite数据库还是将数据加载到内存中?根据您的回答,您可以直接提高搜索性能.


mcl*_*lin 3

我的解决方案是让查询操作继续运行,但在发送事件以更新 UI 之前检查它们是否已被取消。

这并不完美,因为您仍然可以运行大量查询操作,其结果将永远不会被使用,但它仍然要快一些。