提交线程时出现NSMergeConflict问题?

时间:2011-09-09 02:46:35

标签: objective-c xcode core-data

我正在做一些将从MyAPI下载数据并重复保存到核心数据的函数

例如

======================

            =========================

可能是那样的时候..当函数还没有完成时,我在不同的线程一次又一次地调用该方法

当我使用此函数提交该线程时

+(void)commit {
// get the moc for this thread
NSManagedObjectContext *moc = [self managedObjectContext];
NSThread *thread = [NSThread currentThread];

DLog(@"threadKey commit%@" , [[self class]threadKey]);

if ([thread isMainThread] == NO) {
    // only observe notifications other than the main thread
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(contextDidSave:) name:NSManagedObjectContextDidSaveNotification object:moc];
}

NSError *error;
if (![moc save:&error]) {
    DLog(@"Error in Saving %@", error);
    dispatch_async(dispatch_get_main_queue(), ^{
        //NSString * temp= [NSString stringWithFormat: @"There is error In Saving.. Contact us! :P",error];
        //[[BNUtilitiesQuick UtilitiesQuick] Alert:temp];
    });
}

if ([thread isMainThread] == NO) {
    [[NSNotificationCenter defaultCenter] removeObserver:self name:NSManagedObjectContextDidSaveNotification object:moc];

}

}

(此代码将所有数据保存到缓存中。)

有错误,错误就是那个

"NSMergeConflict (0x1205b7f0) for NSManagedObject (0x10900d70) with objectID 
'0x10cad920 <x-coredata://60AE38D6-EE4C-4FE1-9B9A-5322E301E7D5/City/p2>' with oldVersion = 20 and newVersion = 21 and old object snapshot = 
{\n    Country = \"0x10611dd0 <x-coredata://60AE38D6-EE4C-4FE1-9B9A-5322E301E7D5/Country/p1>\";\n    Name = \"Jakarta Barat\";\n} and new cached row = 
{\n    Country = \"0x1019e1f0 <x-coredata://60AE38D6-EE4C-4FE1-9B9A-5322E301E7D5/Country/p1>\";\n    Name = \"Jakarta Barat\";\n}"

任何人都能告诉我它有什么错误吗?

例如,什么是0x10611dd0?那是记忆位置吗?

核心数据ID是什么?

错误如何显示?看起来像coredata试图合并已经相同的变化。

是几个线程同时管理DIFFERENT managedobjectcontext。所有这些coredata都拥有相同的持久存储。

1 个答案:

答案 0 :(得分:0)

这里的问题是您尝试将两个对象与相同的objectID合并但Country的值不同。国家/地区之后的十六进制是此属性的地址,因此您似乎为该国家/地区设置了两个不同的对象,这会导致合并错误。