【发布时间】:2012-03-09 22:19:33
【问题描述】:
我在我的应用程序中使用 iCloud 已经有一段时间了,最近遇到了设备拒绝相互通信的问题。或者至少在我开始记录合并发生的方法之前,我是这么想的。我的persistentStoreCoordinator 的设置如previous question of mine 中所述。
问题如下。在设置我的managedObjectContext 时,我向它添加了一个观察者来查看 NSPersistentStoreDidImportUbiquitousContentChangesNotification 通知,如下所示:
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(mergeChangesFrom_iCloud:) name:NSPersistentStoreDidImportUbiquitousContentChangesNotification object:coordinator];
其中coordinator 设置为NSPersistentStoreCoordinator *coordinator = [self persistentStoreCoordinator]。
我的iCloud方法如下:
- (void)mergeiCloudChanges:(NSNotification *)note forContext:(NSManagedObjectContext *)moc {
NSLog(@"insert %@", [[note userInfo] valueForKey:@"inserted"]);
NSLog(@"delete %@", [[note userInfo] valueForKey:@"deleted"]);
NSLog(@"update %@", [[note userInfo] valueForKey:@"updated"]);
[moc mergeChangesFromContextDidSaveNotification:note];
NSNotification *refreshNotification = [NSNotification notificationWithName:@"RefreshAllViews" object:self userInfo:[note userInfo]];
[[NSNotificationCenter defaultCenter] postNotification:refreshNotification];
}
- (void)mergeChangesFrom_iCloud:(NSNotification *)notification {
NSLog(@"merging changes");
NSManagedObjectContext *moc = [self managedObjectContext];
[moc performBlock:^{
[self mergeiCloudChanges:notification forContext:moc];
}];
}
所以现在我们遇到了实际问题
起初,同步进行得很顺利。来自一台设备的数据被更改,然后该更改出现在另一台设备上。但现在,什么都没有。奇怪的部分是您在mergeiCloudChanges:forContext: 中看到的那些日志。合并实际上发生了。我看到这触发了。但是合并注释的insert、delete 和update 部分总是没有内容。因此发生了合并,但没有数据。对于我的一生,我无法弄清楚为什么会这样或如何让它再次正确同步。任何帮助都将不胜感激。
注意:我还在为我的NSUbiquitousKeyValueStore 使用NSUbiquitousKeyValueStoreDidChangeExternallyNotification 通知(我用它来同步NSUserDefault 键值),并且这些通知传输和更新完全没有任何问题,这让我感到困惑更多关于为什么persistentStoreCoordinator 通知是空白的。
我真的希望有人以前见过/经历过这种情况,因为在我用尽了我能想到的所有方法来寻找和解决这个问题的两周后,我觉得我现在处于停滞状态。
【问题讨论】:
-
您在日志中看到任何 iCloud 错误吗?您是否尝试过删除所有应用程序的 iCloud 数据,从设备中删除应用程序并将其安装干净?
-
@KostiantynSokolinskyi 我没有在日志中看到任何错误,没有。时不时会出现“无法下载项目”错误,但随着 iCloud 重试下载本身,这些错误很快得到解决。我已经完成了全新安装,并删除了 iCloud 目录(使用
NSFileManager删除保存事务日志的 cloudURL)。没有运气。在这一点上,我可以让一个设备与另一个设备通信,但反过来不行。对于我的生活,我无法弄清楚出了什么问题。 -
mergeChangesFromContextDidSaveNotification 不是在线程之间传输更改(至少在旧方法中)?但是 NSPersistentStoreDidImportUbiquitousContentChangesNotification 会通知您有关 iCloud 的更改。真的需要 mergeChangesFromContextDidSaveNotification 吗?在我的测试中,来自 iCloud 的更改已经在此通知之后导入。
-
嘿@StephanZehrer,
mergeChangesFromContextDidSaveNotification可能需要也可能不需要。我刚刚从苹果食谱代码的 iCloud 版本中获取了它。如果您注意到合并过程无论如何都会发生,我可能会尝试从代码中删除它。此后我找到了解决此问题的方法,但是由于它非常严重(完全删除 iCloud 数据并从头开始以获得功能齐全的同步),因此我还没有给出答案,因为我仍在为侵入性较小的方法工作接近 -
@slev 我的通知没有问题。我只是使用了似乎工作的代码。我只是试图了解它的作用或我为什么需要它。但是 WWDC 2011 Session 303 解释了它。我在某些情况下遇到了这个错误:stackoverflow.com/questions/8937805/…
标签: iphone ios core-data ios5 icloud