mergeChangesFromContextDidSaveNotification中的核心数据崩溃 - >呼叫循环

时间:2014-02-18 18:42:31

标签: ios core-data

我对CoreData有疑问,我不知道更进一步。我将它与ICloud一起使用并在两个iPhone上进行测试。

现在我一个接一个地在两部手机上启动我的应用程序。我在一部手机中添加了一条记录。一旦两部电话切换到“使用本地存储:0”,我就可以看到一部电话上的内存(收到更改通知的电话)。

调用[self.howRUDocument.managedObjectContext mergeChangesFromContextDidSaveNotification:notification]时会发生这种情况;方法。当我调试时,stepover mergeChangesFromContextDidSaveNotification将永远不会到达下一行。

- (id)initWithDocumentName:(NSString *)documentName {
    self = [super init];
    if (self) {
        self.documentName = documentName;
        iCloudCommunicator = [ICloudCommunicator sharedInstance];
        [iCloudCommunicator registerForICloudAccountChange:self];
        if ([iCloudCommunicator useICloud]) {
            [[NSNotificationCenter defaultCenter] addObserver:self
                                                     selector:@selector(documentChanged:)
                                                         name:NSPersistentStoreDidImportUbiquitousContentChangesNotification
                                                       object:self.howRUDocument.managedObjectContext.persistentStoreCoordinator];
        }
    }
    return self;
}

-(void) documentChanged:(NSNotification *)notification {
    [self.howRUDocument.managedObjectContext mergeChangesFromContextDidSaveNotification:notification];
}

这是我在探查器中看到的:

enter image description here

所以它是一个无限循环(不是苹果地址:-D)。有谁知道为什么?

另一个奇怪的是,这个方法属于类Model。我有两个模型从这个类扩展。对于一个合并正在按预期工作,另一个我得到上述异常。

非常感谢!

1 个答案:

答案 0 :(得分:0)

我解决了这个问题。我有一个混乱的设置文件。当创建并将其移动到云时,我正在移动错误的文档URL。 还存在竞争条件,因此文档在创建之前尝试打开。

我有这段代码,效果很好:

- (id)initWithDocumentName:(NSString *)documentName {
    self = [super init];
    if (self) {
        _dataChangeListeners = [[NSMutableArray alloc] init];
        self.documentName = documentName;
        iCloudCommunicator = [ICloudCommunicator sharedInstance];
        [iCloudCommunicator registerForICloudAccountChange:self];
        if ([iCloudCommunicator useICloud]) {
            [[NSNotificationCenter defaultCenter] addObserver:self
                                                     selector:@selector(documentChanged:)
                                                         name:NSPersistentStoreDidImportUbiquitousContentChangesNotification
                                                       object:self.howRUDocument.managedObjectContext.persistentStoreCoordinator];
        }
    }
    return self;
}

-(void) documentChanged:(NSNotification *)notification {
    [self.howRUDocument.managedObjectContext mergeChangesFromContextDidSaveNotification:notification];
    [self notifyDataChangeListeners];
}