代码之家  ›  专栏  ›  技术社区  ›  Emmettoc

如何在CoreData上下文合并后获取对象

  •  5
  • Emmettoc  · 技术社区  · 15 年前

    但合并后无法在主线程中获取托管对象。

    我写的代码是这样的:

    [managedObjectContext performSelectorOnMainThread:@selector(mergeChangesFromContextDidSaveNotification:)
                                           withObject:notification
                                        waitUntilDone:YES];
    
    [self performSelectorOnMainThread:@selector(didMerged:) withObject:objectIds waitUntilDone:YES];
    

    所以我试图通过objectid来获取主线程中的NSManagedObject实例,这些实例是在另一个线程中生成的。起初我尝试了“objectWithId”方法,但它生成了错误对象。然后我尝试了“现有的BojbjExtIdID”方法,但是它部分地生成了对象,而其他的则是NIL,有以下错误:

    [Error] Error Domain=NSCocoaErrorDomain Code=133000 "Operation could not be completed. (Cocoa error 133000.)"
    

    怎么了?在另一个线程中合并后,有没有任何方法可以通过objectid检索所有对象?

    3 回复  |  直到 15 年前
        1
  •  7
  •   Daniel    13 年前

    有两种类型的对象ID。在保存NSManagedObject之前,它有临时对象id。保存之后,它是固定的。所以你可能用错了身份证。。。

    http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/CoreData/Articles/cdUsingMOs.html

        2
  •  2
  •   Martin Brugger    15 年前

    你的上下文合并似乎失败了。

    developer documentation on error 133000

    nsmanagedobjectreferentialintegrityerro 表示试图指向不存在的对象的错误的错误代码。 适用于Mac OS X v10.4及更高版本。 在CoreDataErrors.h中声明。

        3
  •  0
  •   Marcus S. Zarra    15 年前

    NSLog(@"Error: %@\n%@", [error localizedDescription], [error userInfo]);
    

    这会给你更多的信息。

    第二,如果您在多个线程中使用单个上下文,那么您的操作是错误的。您需要查看有关核心数据和线程的文档。基本规则是:每个线程一个上下文;句点。如果需要跨多个线程管理数据,请查看主线程上后台线程的保存通知。我建议回顾一下我在Mac开发人员网络上的文章,看看这些例子。