2015-10-29 39 views
1

短版(TLDR): 哪些一般步驟套裝融入已經設置了通過iCloud的驅動器與iCloud的同步CoreData的應用程序?我很困惑我將如何使用Ensembles來促進同步過程。步驟套裝添加到現有Coredata/iCloud的應用

長的版本: 我是一個新手程序員,我已經打了一個大牆的iCloud/CoreData同步(這裏iOS 9 CoreData/ICloud - No such document at URL所示)。

我的應用完全適用於雲同步的例外。所有配置都可以正確與icloud驅動器同步 - 並且它可以在99%的時間內運行 - 但我得到的錯誤隨機破壞了我的應用程序,它們來自代碼的蘋果端(「圖書管理員返回了一個嚴重錯誤...」)。

我的數據全是coredata(源碼)和我的應用程序在斯威夫特編程2.

Ensembles似乎是一個選項,這將有助於解決我的問題。但是,我完全喪失瞭如何將其整合到我的項目中。我完全不知所措的分解我的整個應用程序的過程。任何人都可以提供一些我需要採取的步驟的指導嗎?手冊和github自述文件非常深入,但我失去了我必須做的事情。鋪天蓋地:(

萬一有幫助,下面是我的AppDelegate文件,其中,我希望所有的工作都需要做...

//MARK: General 
func backgroundThread(delay: Double = 0.0, background: (() -> Void)? = nil, completion: (() -> Void)? = nil) { 
    dispatch_async(dispatch_get_global_queue(Int(QOS_CLASS_USER_INITIATED.rawValue), 0)) { 
     if(background != nil){ background!(); } 

     let popTime = dispatch_time(DISPATCH_TIME_NOW, Int64(delay * Double(NSEC_PER_SEC))) 
     dispatch_after(popTime, dispatch_get_main_queue()) { 
      if(completion != nil){ completion!(); } 
     } 
    } 
} 


func applicationWillResignActive(application: UIApplication) { 
    // Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state. 
    // Use this method to pause ongoing tasks, disable timers, and throttle down OpenGL ES frame rates. Games should use this method to pause the game. 
} 
// 

func applicationDidEnterBackground(application: UIApplication) { 
    // Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later. 
    // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits. 
    self.saveContext() 

} 

func applicationWillEnterForeground(application: UIApplication) { 
    // Called as part of the transition from the background to the inactive state; here you can undo many of the changes made on entering the background. 
    currentiCloudToken = NSFileManager.defaultManager().ubiquityIdentityToken 

} 

func applicationDidBecomeActive(application: UIApplication) { 
    // Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface. 

} 

func applicationWillTerminate(application: UIApplication) { 
    // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:. 
    // Saves changes in the application's managed object context before the application terminates. 
    self.saveContext() 
} 

// MARK: - Core Data stack 

lazy var managedObjectModel: NSManagedObjectModel = { 
    // The managed object model for the application. This property is not optional. It is a fatal error for the application not to be able to find and load its model. 
    let modelURL = NSBundle.mainBundle().URLForResource("Model", withExtension: "momd")! 
    return NSManagedObjectModel(contentsOfURL: modelURL)! 
    }() 

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) 


    let documentsDirectory = NSFileManager.defaultManager().URLsForDirectory(NSSearchPathDirectory.DocumentDirectory, inDomains: NSSearchPathDomainMask.UserDomainMask).last as NSURL! 

    let storeURL = documentsDirectory.URLByAppendingPathComponent("ArrivedAlive.sqlite") 

    var error: NSError? = nil 
    var failureReason = "There was an error creating or loading the application's saved data." 
    let storeOptions = [NSPersistentStoreUbiquitousContentNameKey: "ArrivedAliveStore", NSMigratePersistentStoresAutomaticallyOption: true, NSInferMappingModelAutomaticallyOption: true] 

    do { 
     try coordinator!.addPersistentStoreWithType(NSSQLiteStoreType, configuration: nil, URL: storeURL, options: storeOptions) 
    } catch var error1 as NSError { 
     error = error1 
     coordinator = nil 
     // Report any error we got. 
     var dict = [String: AnyObject]() 
     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() 
    } catch { 
     fatalError() 
    } 

    return coordinator 
    }() 


lazy var managedObjectContext: NSManagedObjectContext? = { 
    // Returns the managed object context for the application (which is already bound to the persistent store coordinator for the application.) This property is optional since there are legitimate error conditions that could cause the creation of the context to fail. 
    let coordinator = self.persistentStoreCoordinator 
    if coordinator == nil { 
     return nil 
    } 
    var managedObjectContext = NSManagedObjectContext(concurrencyType: NSManagedObjectContextConcurrencyType.MainQueueConcurrencyType) 

    managedObjectContext.mergePolicy = NSMergeByPropertyObjectTrumpMergePolicy 
    managedObjectContext.persistentStoreCoordinator = coordinator 

    return managedObjectContext 
    }() 

// MARK: - Core Data Saving support 

func saveContext() { 
    if let moc = self.managedObjectContext { 
     var error: NSError? = nil 
     if moc.hasChanges { 
      do { 
       try moc.save() 
      } catch let error1 as NSError { 
       error = error1 
       // Replace this implementation 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() 
      } 
     } 
    } 
} 

謝謝!

+0

我強烈建議閱讀[免費書籍](http://leanpub.com/ensembles)中的快速入門章節。 –

+0

花了大約3個小時來強調實施Ensembles後,我能夠在大約45分鐘內執行所有更改!你的框架真棒!感謝您的支持! – Charlie

回答

2

事實上,但是,由於您「缺乏經驗」,我建議您不要嘗試更改現有堆​​棧。

相反,我會建議您重寫堆棧。這不是太多的代碼,使用Simple Sync示例作爲您的指南,因爲該應用程序使用iCloud作爲其後端。

一旦你進行了堆棧設置,除了確定何時進行同步以外,除了需要在應用程序中進行更改外,沒有其他更改了。

+0

您是否相信諸如「CoreData:Ubiquity:Librarian」之類的錯誤返回了開始下載時的嚴重錯誤Error Domain = BRCloudDocsErrorDomain Code = 6「和」CoreData:Ubiquity:Librarian返回了開始下載的嚴重錯誤Error Domain = BRCloudDocsErrorDomain Code = 5 「沒有文件在URL」「將被固定下面的例子?我的印象是,幕後發生了一些事情,我無法從這些錯誤中修復! – Charlie

+0

另外,你提到「當你同步」。以前,這一切都是由iCloud自己處理,所以這是我最困惑的確切區域:( – Charlie

+0

我只提到,因爲你可以設置同步在每次保存,或定期和/或手動自動啓動。 –

相關問題