2014-04-04 80 views
0

我正在寫一個非常簡單的應用程序來跟蹤,存儲和組織從iTunes和RottenTomatoes饋入的電影。我把電影放在一個大的背上,通常一次約150部電影。用戶然後可以查看供稿並將電影添加到自定義列表。iCloud,iOS 7中的Web服務的核心數據和數據

我遇到的問題是從網絡中提取數據並與iCloud同步生成電影副本。

我一直在考慮將電影饋送到本地存儲(從iCloud移除),然後在單獨的iCloud核心數據存儲中創建列表和其他用戶值,或者甚至使用iCloud鍵值存儲(儘管保存電影列表可能會很粗糙)。

這是我第一個使用iCloud的應用程序,所以我使用this objc.io article的一些樣板。我做了一些修改,因爲我的Web同步使用後臺NSManagedObjectContext來完成這項工作。後臺MOC保存,然後我的主要MOC合併更改。UI主要是NSFetchedResultsControllers,因此整個系統真正無縫地工作。

這裏是處理iCloud的NSNotifications

// happens when the main MOC saves 
- (void)managedObjectContextDidSaveNotification:(NSNotification *)notification { 
    @synchronized(self) { 
     NSManagedObjectContext *moc = self.backgroundManagedObjectContext; 

     [moc performBlock:^{ 
      [moc mergeChangesFromContextDidSaveNotification:notification]; 
     }]; 
    } 
} 

// happens when the bg MOC saves 
- (void)backgroundManagedObjectContextDidSaveNotification:(NSNotification *)notification { 
    @synchronized(self) { 
     NSManagedObjectContext *moc = self.managedObjectContext; 

     [moc performBlock:^{ 
      [moc mergeChangesFromContextDidSaveNotification:notification]; 
     }]; 
    } 
} 

- (void)persistentStoreDidImportUbiquitousContentChanges:(NSNotification *)notification { 
    @synchronized(self) { 
     NSManagedObjectContext *moc = self.managedObjectContext; 

     [moc performBlock:^{ 
      [moc mergeChangesFromContextDidSaveNotification:notification]; 
     }]; 
    } 
} 

- (void)storesWillChange:(NSNotification *)notification { 
    NSManagedObjectContext *moc = self.managedObjectContext; 

    [moc performBlockAndWait:^{    
     NSError *error = nil; 
     if ([moc hasChanges] && [moc save:&error]) { 
      DDLogInfo(@"MOC saved succesfully"); 
     } 
     else { 
      DDLogError(@"Error saving MOC: %@",error); 
     } 
    }]; 
} 

- (void)storesDidChange:(NSNotification *)notification {} 

我本來以爲我可以在一次的iCloud完成合並更改添加一些邏輯一些代碼,但看起來不是很可靠的,因爲我可以在一個循環結束設備之間的變化。

有關如何使這成爲可能的任何想法?我確信以前人們已經做到了這一點,但我找不到任何有用的資源。

回答

2

如果我正確理解您的情況,用戶有可能幾乎同時在兩臺不同的設備上下載同一部電影,並且在同步完成後,您有一部電影副本。

蘋果對這種情況的建議很簡單,就是在任何iCloud合併之後重新下載。您可以使用相同的電影ID查找對象,並以確定性的方式對重複項進行排序,然後刪除一個。如果您不對它們排序,您可能會刪除一個設備上的一個對象,並刪除另一個設備上的另一個對象,並最終沒有對象。

這篇文章有尋求高效的重複代碼:http://www.atomicbird.com/blog/icloud-complications-part-2

如果你不喜歡這整個合併後的重複數據刪除,如TICDSEnsembles框架允許您提供全球性的ID,其中除去必要重複數據刪除技術。 (披露:我開發的合奏)

+0

因此,排序,將避免任何一種「刪除週期」,其中一個設備刪除dup a,其他設備刪除dup b,他們同步a&b,然後重複?理論上,這兩種設備都會刪除重複的? – rnystrom

+0

是的。這個想法是,他們都應該刪除相同的東西。如果發生這種情況,應該不會有任何乒乓或數據丟失。 –