繁体   English   中英

核心数据:中断执行NSFetchRequest

[英]Core Data: Interrupt executing NSFetchRequest

一直在搜索高低:

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

我正在iPhone应用程序中实现增量搜索,我已经尝试过优化它的各种方法,但这还不够(我有42,000条记录),所以我必须在NSOperation中运行它。 键入新字符时,我需要取消之前的fetchRequest,但[nsoperation cancel]不执行任何操作。

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

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

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

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

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

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

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

如果用户按“A”开始,您仍然需要测试该用例。

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

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

这并不完美,因为你仍然可以运行大量的查询操作,结果永远不会被使用,但它仍然要快得多。

我实际上和你有同样的问题。 为了解决这个问题,我使用了performSelector:afterDelay:方法

这有点棘手,但是当用户快速键入快速3个字母时,我不想发送3个请求,但只有一个用户完成输入时。 我设置了0.5或更长的小延迟。

并使用此代码:

[NSObject cancelPreviousPerformRequestsWithTarget:self];
[self performSelector:@selector(fetchSearch:) withObject:searchQuery afterDelay:0.5];

如果用户快速键入,它将取消先前的请求并仅发送最后一个请求。

简短回答 - 不,不是直接,抱歉。

答案很长 - 是的,但你必须做很多工作或努力去做

您将需要在后台线程中运行它(听起来您已经通过NSOperation进行了操作)

在您的提取中,设置限制以一次获得20个结果并在循环中运行它。 每次循环时,将其获得的结果添加到数组中。 每次获取每组结果时,请检查是否要取消请求。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM