iOS - NSUbiquitousKeyValueStore不“实际”同步

时间:2012-08-04 05:00:51

标签: iphone objective-c ios synchronization icloud

我正在使用NSUbiquitousKeyValueStore来同步我的应用偏好设置,而我正在使用iPhone 3GS和iPhone 4两种设备测试同步过程。

当我在一台设备(例如iPhone 3GS)中更改首选项时,它会使用以下代码将首选项同步到NSUbiquitousKeyValueStore

NSUbiquitousKeyValueStore *keyStore = [NSUbiquitousKeyValueStore defaultStore];
NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];

    [keyStore setObject:[userDefaults objectForKey:S_KEY_UI_SOUNDS]
                 forKey:S_KEY_UI_SOUNDS];

if ([keyStore synchronize]) {
    NSLog(@"TO ICLOUD - UI SOUNDS %@", [keyStore objectForKey:S_KEY_UI_SOUNDS]);
}

但是会出现两个问题:

首先:虽然已注册NSUbiquitousKeyValueStoreDidChangeExternallyNotification,但我从未在iPhone 4上收到过。因此,如果iPhone 4处于活动状态,而iPhone 3GS会改变首选项,那么iPhone 4就会变得不知情它的。

第二:当iPhone开始同步NSUbiquitousKeyValueStore的偏好设置时,它永远不会使用iPhone 3GS获得新的偏好设置(请参阅下面的代码)。尽管与NSUbiquitousKeyValueStore成功同步(同步方法返回YES)。

NSUbiquitousKeyValueStore *keyStore = [NSUbiquitousKeyValueStore defaultStore];
if ([userDefaults synchronize]) {
    NSLog(@"FROM - UI SOUNDS %@", [keyStore objectForKey:S_KEY_UI_SOUNDS]);
}

有没有解决方法?或者我做错了什么?

1 个答案:

答案 0 :(得分:3)

首先-synchronize与“与iCloud服务器同步”无关。它是关于同步更改和磁盘上的本地存储。一旦它在磁盘上,底层引擎会在您认为合适的时候将您的更改推送到云端(通常在大约3秒后)。

其次,您应该订阅商店更改通知。

简而言之,使用NSUbiquitousKeyValueStore时应该做的第一件事就是:

store = [NSUbiquitousKeyValueStore defaultStore];
// subscribe immediately to any change that might happen to the store
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(storeDidChangeExternally:) name:NSUbiquitousKeyValueStoreDidChangeExternallyNotification object:store];

// get any changes since the last app launch right now (safer)
[store synchronize];

最后,与云的同步发生在“适当的时间”(暂时无法控制)。

只是为了给你一个想法,一旦你将内存中的变化“同步”到磁盘,引擎通常会“很快”启动与云的同步并推送你的更改。

然后,服务器会将通知推送到其他设备,然后这些设备也将安排与云同步。

在正常情况下,设备同步需要约7秒。