0

我有一个 fetchRequest 最多需要 4-5 秒才能完成。由于它是按您类型搜索的解决方案的一部分,有没有办法中止 fetchRequest?

我使用计时器设置在用户结束输入后 600 毫秒后开始搜索我的数据库。所以有可能新的搜索必须在旧搜索完成之前开始。

我还没有找到任何似乎正确的 NSMangedObjectContext 方法。只是设置旧的 fetchRequest = nil 方法吗?还是在后台发生了什么?

有任何想法吗?

提前致谢!

PS:我也在努力提高我的查询速度。也许有人对此也有想法: https ://stackoverflow.com/questions/4695729/query-performance-with-large-database

4

3 回答 3

1

更好的方法是对获取请求对象进行位置限制。

  • (void)setFetchLimit:(NSUInteger)limit 参数 limit 接收者的获取限制。0 指定没有获取限制。讨论

特殊注意事项 如果设置获取限制,框架会尽最大努力但不保证提高效率。对于除 SQL 存储之外的每个对象存储,使用 fetch 限制执行的 fetch 请求实际上只是执行无限制的 fetch 并丢弃未请求的行。

于 2011-02-11T22:55:12.767 回答
0

假设您使用 UITextField 作为文本输入,为什么不将 fetchRequest 逻辑移动到textField:shouldChangeCharactersInRange:replacementString:(UITextField) 委托方法?

每次用户从文本字段中输入或删除字符时都会调用此方法,因此它是在触发获取请求之前检查最少字符数以及需要您更改文本的理想场所将现有的 fetchrequest 设置为 nil 并开始一个新的。

于 2011-02-11T23:05:09.737 回答
0

我不认为你可以,因为它几乎肯定会捆绑执行获取的线程。上一次我需要做这样的事情时,我生成了一个后台线程,带有一个基本的 condvar (NSCondition) 来发出新输入可用-performSelectorOnMainThread:...时的信号,并在输出准备好时发出信号。这意味着后台线程将在获取新的“最新”输入之前继续处理过时的输入一段时间。

您可以通过在添加新操作(表示最新输入)之前取消队列上的所有操作(表示旧输入)来对 NSOperation/NSOperationQueue 做类似的事情。

由于 NSMO/NSMOC 不是线程安全的,您可能想要传递一组(前几个)MOID。

于 2011-06-29T02:21:47.737 回答