【问题标题】:Crash while executing fetch request执行获取请求时崩溃
【发布时间】:2011-06-14 09:44:01
【问题描述】:

我在执行 executeFetchRequest:error: 时发生了崩溃:

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];

据我了解,在主线程中同步完成的 fetch 花费了太多时间,超过 10 秒,并且进程被挂起。

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

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

但我想知道我的假设是否真的正确,以及是否有更简单的解决方案来解决这个问题。 非常感谢。

【问题讨论】:

    标签: iphone core-data asynchronous crash request


    【解决方案1】:

    您不能将MATCHES 运算符与 SQL 存储(您几乎肯定会使用)一起使用,因为 sqlite 不支持正则表达式。我原以为它会出错而不是超时,但显然不是。

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

    【讨论】:

    • 感谢 TechZen。其余情况不会出错,但会返回不正确的结果。我会改变它。您认为无论如何都需要在后台获取吗?
    • 除了非常大的数据集外,通常没有必要。此外,如果您要通过 UI 获取信息以显示给用户,您是否希望用户继续处理过时的信息?您可能不会在后台为 UI 进行如此获取通常没有任何用处。然而,真正的答案总是一样的:从最简单的解决方案开始并对其进行压力测试。只有采用更复杂的解决方案才是最简单的解决方案,经过测试并证明是不够的。
    【解决方案2】:

    错误很明显:)

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

    【讨论】:

      猜你喜欢
      • 2017-07-09
      • 2015-01-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多