2013-01-01 31 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或合併它而不詢問用戶(如果可能的話,不應該問他什麼) –