2013-01-01 100 views
2

我的应用程序是我之前询问过的。它是一个XML解析器,它显示了来自XML的多个项目,等于该应用程序已打开的天数。我的问题主要是这样的:我在1.0版本中没有与iCloud建立任何关系。我很快就会发布iPad版本的应用程序,因为它受欢迎,并且担心那些在iPhone上使用该应用程序一段时间的应用程序现在将重置为iPad版本的第1天。我在GitHub上发现了MKiCloudSync,并想知道这是否会很好实现,以便应用始终在所有设备上保持同步?如果确实如此,那么在应用程序的1.1版本中添加它会自动与现有库进行同步,还是必须先更新iPhone版本,让它同步,然后再将它取得iPad版本?基本上只是希望它保持同步。NSUserDefaults和iCloud

这里是我用来存储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]; 
    } 

    } 

感谢

回答

3

当你看MKiCloudSync的源代码(这实际上是很短),你会发现它只是存储在整个用户默认字典中的iCloud,只要它的任何变化。

每当iCloud中的任何内容发生更改时,它都会使用存储在iCloud中的所有本地用户默认值进行覆盖。

没有冲突解决的概念或类似的东西,它只会从设备上次更改的所有值中获取。对于您的用例,这基本上意味着iPhone上的现有数据很有可能被从新iPad版本推送到iCloud的初始(可能是空的)数据覆盖。

顺便说一句,你应该永远呼叫sleepapplication:didFinishLaunchingWithOptions:(基本上,它一般并不需要在所有调用它,但它是特别糟糕的这种方法,因为如果没有完成足够快的速度,你的应用可以得到被系统杀死)。

+0

叶这就是我需要的词:D冲突解决 - 你的应用程序iPhone在这种情况下可以重置! –

+0

关于其他可行的类或者我可以用来处理冲突解决方法的任何建议? – user717452

+0

这个怎么样...而不是调用MKiCloudSync时,应用程序变为活动,我添加一个按钮到UI调用同步,并有同步它?这样,用户可以选择要同步的设备以及何时进行同步?它不会是一个完美的解决方案,因为它不会每次都同步,但至少可以解决覆盖已经运行了50天的新设备的问题,正如Daji-Djan所说。 或...每当应用程序准备关闭时询问用户是否要同步数据,都会弹出UIAlertView? – user717452

0

它将很好地工作在技术上,但结果可能是坏的......应该有一些“冲突处理” /使一台设备的主...

让我用一个例子解释:

iphone与应用1.0在设备A上运行的,并已用于50天 =>不关心有关的icloud

现在ipad的与应用程序1.1正在运行5天 =>写入其设置到icloud

现在设备A的应用更新为1.1 =>看到icloud。将需要合并更改...它不能只使用icloud内容,因为它会重置设备A到一些早期的状态,新的ipad保存

+0

关于如何处理冲突解决的任何建议,或者重写某些MKiCloud类,或者在其他类中处理它? – user717452

+0

https://github.com/Daij-Djan/DDiCloudSync提供了一个冲突处理代理 –

+0

它基本上是一个完整的重写..它提供了一个在同步之前调用的方法。那里你可以提出一个uialert或合并它而不询问用户(如果可能的话,不应该问他什么) –