2

私のアプリは、以前に質問したアプリです。これは、アプリを開いた日数と同じ数の XML 項目を表示する XML パーサーです。私の質問は主に次のとおりです。バージョン 1.0 では、iCloud で何も設定していません。人気のため、まもなく iPad バージョンのアプリをリリースしますが、iPhone でしばらくアプリを使用していた人が、iPad バージョンで Day 1 にリセットされるのではないかと懸念しています。GitHub でMKiCloudSyncを見つけたので、アプリがすべてのデバイス間で常に同期されるように、これを実装するのは良いことではないかと考えました。もしそうなら、アプリのバージョン 1.1 に追加すると、既存のライブラリと自動的に同期されますか? それとも、最初に iPhone バージョンを更新し、同期させてから、iPad 用に入手する必要がありますか? 基本的には、同期を維持したいだけです。

NSUserDefault 値を格納するために使用する AppDelegate コードを次に示します。ただし、一部の NSUserDefaults は他のクラスで変更される可能性があります。

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    sleep(3);

    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];

    if (![defaults integerForKey:@"totalDays"]) {

        // if there is no value for the key, set it to 1
        [defaults setInteger:0 forKey:@"totalDays"];

    }
    if (![defaults objectForKey:@"currentDate"]) {
        [defaults setObject:@"32 01" forKey:@"currentDate"];
    }
    if (! [defaults boolForKey:@"marked"]) {
        [defaults setBool:NO forKey:@"marked"];

    }
    if (![defaults arrayForKey:@"checkedrows"]) {
        NSMutableArray *arr1  = [NSMutableArray arrayWithArray:[defaults arrayForKey:@"checkedrows"]];
    }
    NSDate *date = [NSDate date];

    NSDateFormatter *dateFormat = [[NSDateFormatter alloc]init];
    [dateFormat setDateFormat:@"dd MM"];

    NSString *dateString = [dateFormat stringFromDate:date];

    [dateFormat release];

    NSString *checkdate = [defaults objectForKey:@"currentDate"];

    if (![dateString isEqualToString:checkdate]) {
        NSInteger currentnumber = [defaults integerForKey:@"totalDays"];

        [defaults setObject:dateString forKey:@"currentDate"];
        [defaults setInteger:currentnumber+1 forKey:@"totalDays"];
    }

 [defaults synchronize];

    [window addSubview:tabBarController.view];
    [window makeKeyAndVisible];

    return YES;
}

- (void)applicationDidBecomeActive:(UIApplication *)application
{

    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
    NSLog(@"enteredfore");
    NSDate *date = [NSDate date];

    // format it
    NSDateFormatter *dateFormat = [[NSDateFormatter alloc]init];
    [dateFormat setDateFormat:@"dd MM"];

    // convert it to a string
    NSString *dateString = [dateFormat stringFromDate:date];

    // free up memory
    [dateFormat release];

    NSString *checkdate = [defaults objectForKey:@"currentDate"];
    NSLog(@"hereitis%@", checkdate);

    if (![dateString isEqualToString:checkdate]) {
        NSInteger currentnumber = [defaults integerForKey:@"totalDays"];
        NSLog(@"The current number is %i", currentnumber);
        [[NSNotificationCenter defaultCenter] postNotificationName:@"EnteredForeground"
                                                            object:nil];
        [defaults setObject:dateString forKey:@"currentDate"];
        [defaults setInteger:currentnumber+1 forKey:@"totalDays"];
        [defaults synchronize];
    }

    }

ありがとう

4

2 に答える 2

3

MKiCloudSync のソース コード (実際には非常に短いものです) を見ると、ユーザー デフォルト ディクショナリが変更されるたびに、ユーザー デフォルト ディクショナリ全体が iCloud に保存されていることがわかります。

iCloud の何かが変更されるたびに、すべてのローカル ユーザーの既定値が iCloud に保存されているもので上書きされます。

競合解決などの概念はありません。最後に変更されたデバイスからすべての値を取得するだけです。あなたのユースケースでは、これは基本的に、iPhone 上の既存のデータが、新しい iPad バージョンから iCloud にプッシュされる最初の (おそらく空の) データによって上書きされる可能性が高いことを意味します。

ところで、絶対に呼び出してはいけません(基本的に、呼び出す必要はほとんどありませんが、このメソッドでは特に悪いことです。なぜなら、このメソッドが十分に速く終了しないと、アプリがシステムによって強制終了される可能性があるためです)。sleepapplication:didFinishLaunchingWithOptions:

于 2013-01-01T18:28:27.980 に答える
0

技術的には問題なく動作しますが、結果が悪い可能性があります...「競合処理」が必要です/1つのデバイスをマスターにします...

例を挙げて説明しましょう:

アプリ1.0を搭載したiPhoneはデバイスAで実行されており、50日間使用されています=> icloudは気にしません

現在、アプリ1.1を搭載したiPadは5日間実行されています=>その設定をicloudに書き込みます

現在、デバイス A のアプリは 1.1 に更新されています => icloud が表示されます。変更をマージする必要があります...デバイスAを新しいiPadが保存した以前の状態にリセットするため、icloudコンテンツを使用することはできません

于 2013-01-01T18:29:37.903 に答える