2011-06-14 64 views
0

我没有崩溃,而执行executeFetchRequest:错误:崩溃而执行读取请求

MyApp[595]已经超出允许的时间活跃断言:

{(
    <SBProcessAssertion: 0x1e5d1260> identifier: Suspending process: MyApp[595] 
permittedBackgroundDuration: 10.000000 reason: suspend owner pid:29 preventSuspend 
    preventThrottleDownCPU preventThrottleDownUI 

这是我的代码:

NSString *predString = [NSString stringWithFormat:@"categoryId MATCHES '%@'", categoryId]; 
NSPredicate *predicate = [NSPredicate predicateWithFormat:predString]; 
[request setPredicate:predicate]; 
NSError *error = nil; 
NSArray* objects = [context executeFetchRequest: request error: &error]; 

据我所知,在主线程中同步完成的获取花费了太多时间,超过10秒,并且进程被暂停。

在浏览互联网,我发现这个很好的解决方案,使获取异步:

http://blog.zssz.me/2010/01/asynchronous-fetch-in-core-data.html

但我想知道如果我的实际的假设是正确的,如果有这个问题简单的解决方案。 非常感谢。

回答

0

你不能使用MATCHES运算符与SQL存储(你几乎肯定使用),因为sqlite不支持正则表达式。我本来期望它错误出来,而不是超时,但显然不是。

您想使用CONTAINS或更好,==。如果您有一个名为catergoryID的属性,它通常表示具有特定唯一值的属性,而不是具有很多细微变化的属性。使用==/equals将产生更快的获取。

+0

感谢TechZen。其余案例不会错误,但会返回不正确的结果。我会改变它。你认为无论如何都需要在后台进行抓取? – toupper 2011-06-15 07:34:10

+0

除了非常大的数据集之外,通常没有必要。此外,如果您要通过用户界面获取信息以向用户显示,您是否希望用户继续处理过时的信息?您可能不会在UI的背景中提取通常没有任何用处。然而,真正的答案总是相同的:从最简单的解决方案开始并对其进行压力测试。只采用更复杂的解决方案是最简单的解决方案经过测试并证明不足。 – TechZen 2011-06-15 15:05:05

+0

我明白了,非常感谢! – toupper 2011-06-16 11:51:39

0

错误是非常清楚:)

我会尝试它在后台线程,看看会发生什么。