我试图保存数据并与CoreData和多线程合并为iPhone应用程序。 但是在合并之后我无法在主线程中获得托管对象。
我写的代码就像这样:
[managedObjectContext performSelectorOnMainThread:@selector(mergeChangesFromContextDidSaveNotification:)
withObject:notification
waitUntilDone:YES];
[self performSelectorOnMainThread:@selector(didMerged:) withObject:objectIds waitUntilDone:YES];
所以我尝试传递objectIds来获取主线程中的NSManagedObject实例,这些实例是在另一个线程中生成的。起初我尝试了“objectWithId”方法,但它生成了故障对象。然后我尝试了“existingObjectWithID”方法,但它部分生成了对象,其他的则为nil,后面跟着Error:
[Error] Error Domain=NSCocoaErrorDomain Code=133000 "Operation could not be completed. (Cocoa error 133000.)"
有什么问题?有没有办法在另一个线程中合并后如何通过objectIds检索所有对象?
谢谢。
答案 0 :(得分:7)
有两种类型的对象ID。在保存NSManagedObject之前,它具有临时对象ID。保存后,它是固定的。所以你可能会使用错误的ID ...
在此处阅读托管对象ID和URI:http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/CoreData/Articles/cdUsingMOs.html
答案 1 :(得分:2)
您的上下文似乎合并失败。
developer documentation on error 133000
NSManagedObjectReferentialIntegrityError = 133000
NSManagedObjectReferentialIntegrityError 错误代码表示尝试触发指向不存在的对象的错误。 可以访问存储,但找不到与故障对应的对象。 适用于Mac OS X v10.4及更高版本。 在CoreDataErrors.h中声明。
答案 2 :(得分:0)
首先,您需要展开错误。将输出更改为:
NSLog(@"Error: %@\n%@", [error localizedDescription], [error userInfo]);
这将为您提供更多信息。
其次,如果您在多个线程中使用单个上下文,那么您做错了。您需要查看有关Core Data和线程的文档。基本规则是:每个线程一个上下文;期。如果需要跨多个线程管理数据,请查看主线程上后台线程的保存通知。我建议在Mac开发者网络上查看我的文章,以获取相关示例。