3

アプリケーション設定の同期に使用NSUbiquitousKeyValueStoreしており、iPhone 3GS と iPhone 4 の 2 つのデバイスを使用して同期プロセスをテストしています。

1 つのデバイス (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]);
}

ただし、次の 2 つの問題が発生します。

まず、 に登録されていますがNSUbiquitousKeyValueStoreDidChangeExternallyNotification、iPhone 4 で受信することはありません。そのため、iPhone 3GS が設定を変更している間に iPhone 4 がアクティブな場合、iPhone 4 はそれを認識しなくなります。

2 番目: iPhone が から設定の同期を開始すると、NSUbiquitousKeyValueStoreiPhone 3GS を使用して新しい設定セットを取得することはありません (以下のコードを参照)。これは、との同期が成功したにもかかわらずですNSUbiquitousKeyValueStore(synchronize メソッドは YES を返します)。

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

それに対する修正はありますか?または私は何を間違っていますか?

4

1 に答える 1

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 秒かかります。

于 2012-08-04T05:21:37.393 に答える