首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >NSUbiquitousKeyValueStore同步问题

NSUbiquitousKeyValueStore同步问题
EN

Stack Overflow用户
提问于 2012-07-09 13:31:23
回答 6查看 4.2K关注 0票数 7

我在使用NSUbiquitousKeyValueStore和让它在两个设备上可靠地同步方面遇到了麻烦。这开始让我发疯了。疯了。

我看着我的代码调用:

代码语言:javascript
复制
[[NSUbiquitousKeyValueStore defaultStore] setObject:_someData forKey:@"SomeData"];
[[NSUbiquitousKeyValueStore defaultStore] synchronize];

但很多时候,数据永远不会出现在另一台设备上。

我看到它在几秒钟内同步,其他时间我等待了一个小时,从未看到过同步。我将设备插入xcode并开始调试,有时数据会突然弹出,有时数据不会弹出。

打完这个电话,退出并重新启动应用程序后,如果我阅读了旧数据,我会看到旧数据,而不是我应该刚刚发布的新数据。在同一设备上。

当应用程序启动时,我调用:

代码语言:javascript
复制
_someData = [[NSUbiquitousKeyValueStore defaultStore] stringForKey:@"SomeData"];

我假设没有需要运行的初始化代码。我找不到这样的例子。

当它工作时,它工作得很好。

然后,今天晚上,我查看了设备日志,在我最后一次退出(并尝试发送数据)后发现了以下内容:

代码语言:javascript
复制
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"}

该路径不是来自我的应用程序沙箱的有效路径(错误的GUID),所以我想知道这是否是我问题的根源。我确实在开发过程中删除和重新安装了很多应用程序,所以我想知道是否有一些旧路径缓存在某个地方,它正在尝试同步这些数据。有没有办法清除它?

我知道我的所有权利设置都是正确的,因为它有时确实有效。

[[NSUbiquitousKeyValueStore defaultStore] synchronize]正在返回YES

其他人有没有看到这个问题或那个错误?当我的应用程序启动和向云发送数据时,我还需要做些什么吗?根据文档和示例,这似乎很容易。

EN

回答 6

Stack Overflow用户

发布于 2013-05-12 22:33:59

我在启动时使用它,并立即获得iCloud值或updateKVStoreItems:在不到5秒的时间内调用。

代码语言:javascript
复制
- (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"); 
}
票数 3
EN

Stack Overflow用户

发布于 2013-10-26 08:04:38

iCloud键值存储并不打算用于需要定期频繁同步的数据,而且苹果似乎不保证这些操作的及时性。苹果states

键值存储用于存储不经常更改的数据。如果设备上的应用程序频繁更改键值存储,系统可能会推迟某些更改的同步,以便最大限度地减少到服务器的往返次数。应用程序进行更改的频率越高,以后的更改就越有可能被推迟,而不会立即显示在其他设备上。

如果你的应用程序没有立即同步是可以的,而你对此感兴趣的是加速测试/调试,那么除非你改变你的技术,否则这似乎是一个必要的挫折。

票数 2
EN

Stack Overflow用户

发布于 2014-04-09 18:38:16

NSUbiquitousKeyValueStore的文档详细说明了synchronize的工作原理。我认为罗杰的假设是,当你调用:

代码语言:javascript
复制
[[NSUbiquitousKeyValueStore defaultStore] synchronize];

它会立即上传数据(假设有网络连接)。事实并非如此。调用synchronize只是将您在内存中设置的键和值保存到本地磁盘缓存中。完成此操作后,系统将通知iCloud已准备好上载数据。下面是synchronize方法文档中提到的关键信息:

此方法不强制将新的键和值写入iCloud。相反,它让iCloud知道可以上传新的键和值。不要依赖于您的密钥和值在其他设备上立即可用。系统控制何时上载这些键和值。key-value存储的上传请求频率限制为每分钟几次。

Link to documentation

简而言之,系统控制您的键和值何时上载到iCloud,调用synchronize只是存储它们的本地缓存,并通知iCloud等待上载的新数据。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11389516

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档