【问题标题】:CoreData ManagedObjectContext Recursive Save ErrorCoreData ManagedObjectContext 递归保存错误
【发布时间】:2016-12-14 10:17:12
【问题描述】:

我的一些用户在执行保存时遇到 CoreData 错误。我无法在网上找到有关此错误或如何符号化堆栈跟踪的任何信息。

错误消息是attempt to recursively call -save: on the context aborted, stack trace,下面是完整的错误消息。

有人对如何找出问题所在有任何提示或想法吗?

Error Domain=NSCocoaErrorDomain Code=132001 "(null)" UserInfo={message=attempt to recursively call -save: on the context aborted, stack trace=(
0   CoreData                            0x0000000188cbe70c  + 164
1   Primetime                           0x0000000100077ea4 Primetime + 130724
2   Primetime                           0x00000001000ae988 Primetime + 354696
3   Primetime                           0x0000000100081674 Primetime + 169588
4   Primetime                           0x00000001000802ac Primetime + 164524
5   CoreData                            0x0000000188d8bbd4  + 4568
6   CoreData                            0x0000000188d8a9ec  + 124
7   CoreFoundation                      0x00000001869ac24c  + 20
8   CoreFoundation                      0x00000001869ab950  + 400
9   CoreFoundation                      0x00000001869ab6cc  + 60
10  CoreFoundation                      0x0000000186a187bc  + 1504
11  CoreFoundation                      0x00000001868ef32c _CFXNotificationPost + 376
12  Foundation                          0x000000018738296c  + 68
13  CoreData                            0x0000000188cc16e8  + 724
14  CoreData                            0x0000000188d43ca4  + 1336
15  CoreData                            0x0000000188cbfd04  + 2116
16  CoreData                            0x0000000188cbe808  + 416
17  Primetime                           0x0000000100077ea4 Primetime + 130724
18  Primetime                           0x0000000100089968 Primetime + 203112
19  Primetime                           0x00000001001d47c0 Primetime + 1558464
20  libdispatch.dylib                   0x0000000186459058  + 24
21  libdispatch.dylib                   0x0000000186459018  + 16
22  libdispatch.dylib                   0x000000018645dbcc _dispatch_main_queue_callback_4CF + 1000
23  CoreFoundation                      0x00000001869bfc48  + 12
24  CoreFoundation                      0x00000001869bd834  + 1660
25  CoreFoundation                      0x00000001868ed764 CFRunLoopRunSpecific + 292
26  GraphicsServices                    0x00000001882f0198 GSEventRunModal + 180
27  UIKit                               0x000000018c8668d0  + 664
28  UIKit                               0x000000018c86163c UIApplicationMain + 208
29  Primetime                           0x00000001000ada1c Primetime + 350748
30  libdyld.dylib                       0x00000001864905b8  + 4

【问题讨论】:

  • 您是否有可能从发布NSManagedObjectContextDidSaveNotification 时运行的代码调用save:
  • 我没有使用该通知,但我使用的是NSManagedObjectContextObjectsDidChange。我刚刚检查了NSManagedObjectContextObjectsDidChange 的文档,它说调用save 还不安全。我确实在我的代码中发现了一些可以从NSManagedObjectContextObjectsDidChange 触发保存的地方。我将继续深入研究它,感谢您的提示。
  • 我只在 iOS10 beta 4 中得到这个,在 iOS 9.3.3 中没有发生并且无法找到解决方案。您的用户升级了吗?
  • 我只是记录了错误消息,而不是操作系统版本,所以我不知道。这是可能的,因为只有一小部分用户看到它。

标签: ios core-data nsmanagedobjectcontext


【解决方案1】:

我在 Xcode8/ios10 上遇到了同样的问题。问题是由于调用在以下方法中保存核心数据上下文。

- (void)controllerDidChangeContent:(NSFetchedResultsController *)controller {
    [self methodCallingSaveContext];
}

methodCallingSaveContext

调用保存核心数据上下文。 为了中断递归调用,我用以下方式重写了该方法:

- (void)controllerDidChangeContent:(NSFetchedResultsController *)controller {
        dispatch_async(dispatch_get_main_queue(), ^{
               [self methodCallingSaveContext];
         });
}

现在一切都恢复正常了。

【讨论】:

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