Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone iOS-NSUbiquitousKeyValueStore不';";事实上";同步_Iphone_Objective C_Ios_Synchronization_Icloud - Fatal编程技术网

Iphone iOS-NSUbiquitousKeyValueStore不';";事实上";同步

Iphone iOS-NSUbiquitousKeyValueStore不';";事实上";同步,iphone,objective-c,ios,synchronization,icloud,Iphone,Objective C,Ios,Synchronization,Icloud,我正在使用NSUbiquitousKeyValueStore同步我的应用程序首选项,我正在使用两台设备iphone3gs和iphone4测试同步过程 当我在一台设备(比如iPhone 3GS)中更改首选项时,它会使用以下代码将首选项同步到NSUbiquitousKeyValueStore: NSUbiquitousKeyValueStore *keyStore = [NSUbiquitousKeyValueStore defaultStore]; NSUserDefaults *userDefa

我正在使用
NSUbiquitousKeyValueStore
同步我的应用程序首选项,我正在使用两台设备iphone3gs和iphone4测试同步过程

当我在一台设备(比如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上收到过它。因此,如果iPhone4处于活动状态,而iPhone3GS更改了首选项,则iPhone4将不会意识到这一点

Second:当iPhone开始从
NSUbiquitousKeyValueStore
同步首选项时,它从未使用iPhone 3GS获得新的首选项集(请参见下面的代码)。尽管与
NSUbiquitousKeyValueStore
成功同步(同步方法返回YES),仍会出现这种情况


有解决办法吗?或者说我做错了什么?

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

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

简而言之,在使用
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];
最后,与云的同步发生在“适当的时间”(您现在无法控制它)

给你一个想法,一旦你将内存中的更改“同步”到磁盘上,引擎通常会“很快”启动与云的同步,并推动你的更改

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


正常情况下,设备需要同步7s。

首先,我将测试这个,并考虑一整分钟的同步。其次,我已经这样做了,在被调用的方法中没有收到任何内容(在您的代码中,这是storedidchangeExternal:)。首先可能是由于相同的问题。检查您的iCloud帐户,检查文档和数据开关是否打开,以及您是否通过Wifi(或蜂窝网络,并且文档和数据允许通过蜂窝网络进行同步)此外,iOS 5没有为您提供查看iCloud同步实际发生时间的好方法。你可能会对此提出一个错误。是的,一切都很好,实际上我与iCloud的同步文档非常好。用户可以同步文档,但不能同步用户的首选项,这真的很奇怪!我尝试了整整2分钟,没有同步发生。你能看看完整的控制台(使用Xcode organizer),看看是否在那里看到与
syncdefaultsd
相关的内容吗?另外,别忘了你应该在这两台设备上都设置你的Apple ID帐户,以便进行iCload。。。
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];