2014-12-27 189 views
2

如何用iCloud核心数据取代我现有的核心数据? 这是我persistentStoreCoordinator:Swift - 用iCloud核心数据取代核心数据

lazy var persistentStoreCoordinator: NSPersistentStoreCoordinator? = { 
    // The persistent store coordinator for the application. This implementation creates and return a coordinator, having added the store for the application to it. This property is optional since there are legitimate error conditions that could cause the creation of the store to fail. 
    // Create the coordinator and store 
    var coordinator: NSPersistentStoreCoordinator? = NSPersistentStoreCoordinator(managedObjectModel: self.managedObjectModel) 

    var notificacionCenter: NSNotificationCenter = NSNotificationCenter.defaultCenter() 
    notificacionCenter.addObserver(self, selector: "storesWillChange:", name:NSPersistentStoreCoordinatorStoresWillChangeNotification, object: coordinator) 
    notificacionCenter.addObserver(self, selector: "storesDidChange:", name:NSPersistentStoreCoordinatorStoresDidChangeNotification, object: coordinator) 
    notificacionCenter.addObserver(self, selector: "persistentStoreDidImportUbiquitousContentChanges:", name:NSPersistentStoreDidImportUbiquitousContentChangesNotification, object: coordinator) 

    let url = self.applicationDocumentsDirectory.URLByAppendingPathComponent("MyApp.sqlite") 
    var error: NSError? = nil 
    var failureReason = "There was an error creating or loading the application's saved data." 
    var options: NSDictionary = [NSMigratePersistentStoresAutomaticallyOption : NSNumber(bool: true), NSInferMappingModelAutomaticallyOption : NSNumber(bool: true), 
     NSPersistentStoreUbiquitousContentNameKey : "iCloudStore"] 
    if coordinator!.addPersistentStoreWithType(NSSQLiteStoreType, configuration: nil, URL: url, options: options, error: &error) == nil { 
     coordinator = nil 
     // Report any error we got. 
     let dict = NSMutableDictionary() 
     dict[NSLocalizedDescriptionKey] = "Failed to initialize the application's saved data" 
     dict[NSLocalizedFailureReasonErrorKey] = failureReason 
     dict[NSUnderlyingErrorKey] = error 
     error = NSError(domain: "YOUR_ERROR_DOMAIN", code: 9999, userInfo: dict) 
     // Replace this with code to handle the error appropriately. 
     // abort() causes the application to generate a crash log and terminate. You should not use this function in a shipping application, although it may be useful during development. 
     NSLog("Unresolved error \(error), \(error!.userInfo)") 
     abort() 
    } 

    return coordinator 
}() 

我补充通知,然后呢?如何更换它?

回答

5

您不需要做任何事情就可以让iCloud存储的数据替换本地存储的数据。也就是说,使用iCloud下载的数据更新本地核心数据,并在此后保持一致。

但是,如果您已在用户界面中显示数据,那么当“新的iCloud数据”到达时,“旧本地数据”可能仍会显示。 Using the SQLite Store with iCould的Apple文档描述了如何通过通知来处理更新。总结该引用:在NSPersistentStoreCoordinatorStoresWillChangeNotification的处理程序中,如果存在任何挂起的更改(如果它们存在),则保存它,否则您重置托管对象上下文并禁用用户界面。然后在NSPersistentStoreCoordinatorStoresDidChangeNotification处理程序中更新显示的(和其他)数据并重新启用您的UI。

这是我用于Core Data w/iCloud的。 storeOptions是关键。对于您的Xcode目标,您需要启用iCloud功能,并确保您已选择“iCloud文档”。

{ 
    // ... 

    lazy var persistentStoreCoordinator: NSPersistentStoreCoordinator? = { 
    // The persistent store coordinator for the application. This implementation 
    // creates and return a coordinator, having added the store for the 
    // application to it. This property is optional since there are legitimate 
    // error conditions that could cause the creation of the store to fail. 
    // Create the coordinator and store 
    var coordinator: NSPersistentStoreCoordinator = 
     NSPersistentStoreCoordinator (managedObjectModel: self.managedObjectModel) 

    var storeURL = 
     self.applicationDocumentsDirectory 
     .URLByAppendingPathComponent("iAppSwift.sqlite") 

    var storeOptions = 
     [NSPersistentStoreUbiquitousContentNameKey : "iAppSwiftStore" 
     // NSPersistentStoreRebuildFromUbiquitousContentOption: @(true) 
     ] 

    // 
    self.registerCoordinatorForStoreNotifications (coordinator) 

    var error : NSError? = nil 
    var store : NSPersistentStore! = 
     coordinator.addPersistentStoreWithType (NSSQLiteStoreType, 
     configuration: nil, 
     URL: storeURL, 
     options: storeOptions, 
     error: &error) 

    if nil == store { 
     // handle error 
    } 

    return coordinator 
    }() 

    func registerCoordinatorForStoreNotifications (coordinator : NSPersistentStoreCoordinator) { 
    let nc : NSNotificationCenter = NSNotificationCenter.defaultCenter(); 

    nc.addObserver(self, selector: "handleStoresWillChange:", 
     name: NSPersistentStoreCoordinatorStoresWillChangeNotification, 
     object: coordinator) 

    nc.addObserver(self, selector: "handleStoresDidChange:", 
     name: NSPersistentStoreCoordinatorStoresDidChangeNotification, 
     object: coordinator) 

    nc.addObserver(self, selector: "handleStoresWillRemove:", 
     name: NSPersistentStoreCoordinatorWillRemoveStoreNotification, 
     object: coordinator) 

    nc.addObserver(self, selector: "handleStoreChangedUbiquitousContent:", 
     name: NSPersistentStoreDidImportUbiquitousContentChangesNotification, 
     object: coordinator) 
    } 

    // ... 
} 
+0

现在呢?我的核心数据与iCloud合并?如何在其他设备上检测是否更改刷新UI? – 2014-12-29 14:09:35

+0

'其他设备'将得到'WillChange'和'DidChange'通知。在处理这些通知的处理程序中,您将更新显示的(和其他)数据。 – GoZoner 2014-12-30 06:37:11

+0

'var options:NSDictionary = [NSMigratePersistentStoresAutomaticallyOption:NSNumber(bool:true),NSInferMappingModelAutomaticallyOption:NSNumber(bool:true), NSPersistentStoreUbiquitousContentNameKey:“iCloudStore”iCloud已激活? – 2014-12-30 11:07:03