在managedObjectContext中中止fetchRequest

时间:2011-01-15 14:14:29

标签: iphone nsmanagedobjectcontext

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

我使用定时器设置在用户结束键入后600ms后开始搜索我的数据库。因此,新旧搜索必须在旧搜索完成之前开始。

我没有找到任何似乎正确的NSMangedObjectContext方法。只是设置旧的fetchRequest = nil的方式去?或者后台还有什么事情发生?

有什么想法吗?

提前致谢!

PS:我也在尝试提高查询速度。也许有人也有这个想法: https://stackoverflow.com/questions/4695729/query-performance-with-large-database

3 个答案:

答案 0 :(得分:1)

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

  • (无效)setFetchLimit:(NSUInteger)限 参数 限制 接收器的获取限制。 0指定没有提取限制。 讨论

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

答案 1 :(得分:0)

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

每次用户从文本字段输入或删除字符时都会调用此方法,因此在启动获取请求之前检查最少字符数是完美的位置,以及对文本的更改要求您将现有的fetchrequest设置为nil并启动一个新的。

答案 2 :(得分:0)

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

你可以用NSOperation / NSOperationQueue做类似的事情,取消队列上的所有操作(代表旧输入),然后再添加一个新的输入(代表最新的输入)。

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