2014-11-08 81 views
3

我已經實現了一個擁有大約5萬用戶的iPhone應用程序。當從iOS7切換到iOS8時,許多這些用戶在認爲他們的數據迷路時感受到了一種可怕的感覺。iCloud +核心數據:第一次導入和用戶的數據丟失感

,我實現了我認爲是一個由蘋果

1建議)用戶啓動應用程序

2) iCloud的第一進口行爲,自動,開始synching先前存儲在iCloud上的數據

3)在某點用戶g等通知,從iCloud的數據已準備好感謝NSPersistentStoreUbiquitousTransitionTypeInitialImportCompleted

問題是與3)在某些時候
用戶有數據需要幾分鐘來獲得同步完成,同步了很多,在此期間,他們認爲他們的數據丟失了。

我真的不知道如何讓我的用戶知道他們必須等待看到他們的數據同步,因爲我不知道這個操作什麼時候開始


我在想一個可能的解決方案:

在第一次運行該應用程式,詢問用戶是否希望使用的iCloud。如果他選擇使用它,使用iCloud選項構建數據庫,所以我確切知道同步是從這裏開始的(我想......) 我真的不確定如何實現這種行爲,因爲我一直都看到核心數據設置到AppDelegate,但爲了實現這種行爲,我想我需要移動控制器中的所有CoreData設置。

您對此解決方案有何看法?你如何解決你的應用程序中的這個問題?

回答

2

你的想法是對的,至少是我們所做的。但請將其留在appDelegate中。

在執行「addPersistentStoreWithType」時區分使用iCloud和不使用iCloud。如果你使用iCloud選項,它將直接開始建立本地商店,這是一種佔位符(我相信你知道這一點,但只是爲了讓我的想法清楚)。一旦完成,同步從iCloud開始。所以這是我明白你正在尋找的起點。

您可以使用NSPersistentStoreCoordinatorStoresDidChangeNotification的通知來觀察該進程,並通知您相應由該通知觸發的用戶。

如果您在文檔https://developer.apple.com/library/ios/documentation/DataManagement/Conceptual/UsingCoreDataWithiCloudPG/UsingSQLiteStoragewithiCloud/UsingSQLiteStoragewithiCloud.html#//apple_ref/doc/uid/TP40013491-CH3-SW5中查看「對iCloud事件的反應」,有詳細的說明。

+0

權事件看是NSPersistentStoreCoordinatorStoresDidChangeNotification謝謝! – MatterGoal 2014-11-26 11:05:31

+0

我已經不接受你的答案,因爲當數據已經從iCloud下載時調用「willChange」事件:( – MatterGoal 2014-11-27 09:06:19

2

總而言之,您所描述的事件是帳戶轉換過程的一部分。當以下四個事件之一,將觸發帳戶轉換髮生:

  • 首次導入
  • 使用iCloud帳戶確實改變
  • 的iCloud禁用
  • 應用程序的數據被刪除

在此活動期間,Core Data將發佈NSPersistentStoreCoordinatorStoresWillChangeNotificationNSPersistentStoreCoordinatorStoresDidChangeNotification通知,通知您帳戶正在轉換。我們感興趣的轉換類型是NSPersistentStoreUbiquitousTransitionTypeInitialImportCompleted

有關信息,我已將所有與Core Data相關的代碼移至自己的管理器以簡化操作並將其用於單例設計模式。在設置單身人士時,我向經理註冊所有相關通知(NSPersistentStoreDidImportUbiquitousContentChangesNotification,NSPersistentStoreCoordinatorStoresWillChangeNotification,NSPersistentStoreCoordinatorStoresDidChangeNotification,NSPersistentStoreCoordinatorWillRemoveStoreNotification)。 我存儲幾個信息在我的設置(NSUserDefaults或任何東西)像上次的iCloud狀態(啓用,禁用,未知),如果初始導入完成與否等

我到底是什麼了做是有一個提示(UIAlertController或其他)來獲得確認,如果用戶想要使用iCloud或不。我有一個displayICloudDialogAndForce:completion:方法來做到這一點,只有這樣做,如果我的iCloud狀態設置是未知的或我使用強制參數。

然後,用戶輸入後,我稱之爲setupCoreDataWithICloud:方法,根據用戶選擇的iCloud布爾參數。然後我會根據參數iCloud設置我的核心數據堆棧,在雲端或不在。 如果我使用iCloud進行設置,我會檢查我的設置以獲取iCloud導入密鑰的值(布爾值)。如果值爲NO,那麼我正在提出一種新模式來警告用戶可能需要一些時間的傳入導入。

我已經爲不同的通知註冊了我的經理,特別是NSPersistentStoreCoordinatorStoresDidChangeNotification。在我的storeDidChange:回調中,我正在檢查轉換類型,如果它是NSPersistentStoreUbiquitousTransitionTypeInitialImportCompleted,我正在更改我的模式的內容以向用戶顯示導入已成功,並在幾秒鐘後將其刪除,在我的設置中保存初始值導入完成。

- (void)storeDidChange:(NSNotification *)notification 
{ 
    NSPersistentStoreUbiquitousTransitionType transitionType = [notification.userInfo[NSPersistentStoreUbiquitousTransitionTypeKey] integerValue]; 

    if (transitionType == NSPersistentStoreUbiquitousTransitionTypeInitialImportCompleted) { 
     [settings setDefaults:@(YES) forKey:kSettingsICloudImportedKey]; 
     [ICloudModal dismissWithSuccess]; 

     // ... 
    } 

    // Do other relevant things... 
} 
+0

而你在第一次啓動時做什麼時,NSPersistentStoreUbiquitousTransitionTypeInitialImportCompleted沒有被調用?你在第一次啓動時提供模態...但如果用戶沒有將數據存儲在iCloud上,initialImportComplete通知從不會被調用,所以模式永遠不會關閉 – MatterGoal 2014-11-27 10:10:52

+0

@MatterGoal處理該問題的一種可能方式是觀察無處不在容器。首先執行查詢,如果iCloud文件存在(有一個/ coredata文件夾),那麼用戶的核心數據存儲保存到他們的iCloud,如果沒有/ coredata文件夾,就不會有同步,只是一個理論。 – mattsven 2015-08-30 20:53:26