我只有NSUbiquitousKeyValueStore的麻烦,并让它可以在两台设备之间可靠地同步。它开始让我发疯。狂。
我看着我的代码打电话给:
[[NSUbiquitousKeyValueStore defaultStore] setObject:_someData forKey:@"SomeData"];
[[NSUbiquitousKeyValueStore defaultStore] synchronize];
但有时候,数据永远不会出现在另一台设备上。
我已经看到它在几秒钟内同步,而其他时间我等了一个小时,从未见过同步。我将设备插入xcode并开始调试,有时数据会突然弹出,有时则不会。有时确实如此。
进行此调用后,退出并重新启动应用程序,如果我读取它,我会看到旧数据,而不是我刚刚发布的新数据。在同一台设备上。
当应用程序启动时,我打电话给:
_someData = [[NSUbiquitousKeyValueStore defaultStore] stringForKey:@"SomeData"];
我假设没有需要运行的初始化代码。没有我发现的例子。
当它工作时,效果很好。
然后今晚我正在查看设备日志,并在我上次退出后发现这个(并尝试发送数据):
Jul 8 21:32:03 unknown syncdefaultsd[17296] <Warning>: Error writing storage for com.mycompany.myapp to /private/var/mobile/Applications/4AC8C56E-6060-408B-84F9-F7EC336221D9/Library/SyncedPreferences/com.mycompany.myapp.plist: Error Domain=NSCocoaErrorDomain Code=4 "The operation couldn’t be completed. (Cocoa error 4.)" UserInfo=0xde80d40 {NSFilePath=/private/var/mobile/Applications/4AC8C56E-6060-408B-84F9-F7EC336221D9/Library/SyncedPreferences, NSUnderlyingError=0xde80b20"The operation couldn’t becompleted. No such file or directory"}
该路径不是来自我的Apps沙箱的有效路径(错误的GUID),所以我想知道这是否是我问题的根源。我在开发过程中删除并重新安装了很多应用程序,所以我想知道是否有一些旧的路径缓存在某个地方并且它正在尝试同步这些数据。有没有办法清除它?
我知道我的所有权利都已正确设置,因为它确实有效。
[[NSUbiquitousKeyValueStore defaultStore] synchronize]
正在返回YES
。
是否有其他人看到此问题或该错误?当我的应用程序启动以及将数据发送到云时,我还需要做些什么吗?根据文档和示例,它似乎很容易。
答案 0 :(得分:2)
iCloud键值存储不适用于需要定期频繁同步的数据,而Apple似乎并不保证这些操作的及时性。 Apple states:
键值存储区用于存储不经常更改的数据。如果设备上的应用程序频繁更改键值存储,则系统可以推迟某些更改的同步,以便最小化到服务器的往返次数。应用程序进行更改的频率越高,以后的更改就越有可能延迟,并且不会立即显示在其他设备上。
如果您的应用程序没有立即同步,并且您对此感兴趣是为了加快测试/调试,那么除非您改变技术,否则这似乎是必要的挫折。
答案 1 :(得分:1)
NSUbiquitousKeyValueStore的文档详细说明了同步的工作原理。我认为Roger的假设就是当你打电话时:
[[NSUbiquitousKeyValueStore defaultStore] synchronize];
它将立即上传数据(假设网络连接)。不是这种情况。调用synchronize
只需获取您在内存中设置的键和值,并将它们保存到本地磁盘缓存中。完成此操作后,系统会通知iCloud已准备好上传数据。关键信息在synchronize
方法文档下面提到:
此方法不会强制写入新的键和值 iCloud中。相反,它让iCloud知道新的键和值 可以上传。不要依赖你的钥匙和价值观 立即在其他设备上使用。系统控制何时 键和值上传。上传请求的频率 键值存储限制为每分钟几次。
简而言之,系统控制您的密钥和值何时上传到iCloud,并且调用synchronize
只是存储它们的本地缓存,并通知iCloud等待上传的新数据。
答案 2 :(得分:0)
它可能是设备安装的应用程序列表中的陈旧缓存。尝试删除设备上的应用并重新安装。或者重启设备。
可以肯定的是,您应该向bugreport.apple.com提交报告
答案 3 :(得分:0)
通过Xcode中的管理器检查您的设备控制台。它可能包含有用的信息。即使空的defaultStore同步返回YES,您的权利也可能不正确。
答案 4 :(得分:0)
在这种情况下,如果您使用越狱设备,则必须在icloud和GameCenter支持正常工作之前删除AppSync。显然我认为你有Apple开发帐户。
答案 5 :(得分:0)
我在启动时使用它并立即获取iCloud值或updateKVStoreItems:在&lt;中调用5秒。
- (void) initializeiCloud
{
NSUbiquitousKeyValueStore* store = [NSUbiquitousKeyValueStore defaultStore];
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(updateKVStoreItems:) name:NSUbiquitousKeyValueStoreDidChangeExternallyNotification object:store];
if ([store boolForKey:@"fakeSyncBit"])
{
NSLog(@"in initiCloud setting syncbit NO");
[store setBool:NO forKey:@"fakeSyncBit"];
}
else
{
NSLog(@"in initiCloud setting syncbit YES");
[store setBool:YES forKey:@"fakeSyncBit"];
}
[store synchronize];
NSLog(@"icloud store is synchronized. updateKVStoreItems: should be called shortly");
}