這是一個示例應用程序應用程序,我創建它來模仿我正在處理的案例。這是在我的視圖控制器使用CoreData和雨燕2.0和Xcode 7 BETA4處理親子子程序的應用程序崩潰managedObjectContexts
那麼單一視圖的應用程序創建一個privateObjectContext
是的mainManagedObjectContext
let mainMOC = AppDelegate().managedObjectContext
var privateObjectContext : NSManagedObjectContext?
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
privateObjectContext = NSManagedObjectContext(concurrencyType: .PrivateQueueConcurrencyType)
privateObjectContext?.parentContext = mainMOC
}
一個孩子,我知道保存在孩子MOC將它同步到父級,然後保存父級將其保存到持久性存儲區,但每次保存主要MOC時我省去我的孩子MOC沒有意義並且使得子級MOC冗餘的目的。因此,在我的所有測試完成後,我保存我的父母MOC,並按照預期將其存儲在持久存儲中。
但是,當我模擬應用程序崩潰時(通過轉到任務管理器並強行終止應用程序),它不會存儲在持久性管理器中;它應該有,因爲這個
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()
}
func saveContext() {
if managedObjectContext.hasChanges {
do {
try managedObjectContext.save()
} catch {
// 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.
let nserror = error as NSError
NSLog("Unresolved error \(nserror), \(nserror.userInfo)")
abort()
}
}
}
但managedObjectContext.hasChanges
返回false,儘管在商務部的生命週期中具有的ViewController 上午我改變它錯了地方?
--edit 我使用一個擴展的NSManagedObjectContext批量創建測試對象
privateObjectContext?.performBlock {
self.privateObjectContext?.createTestObjects(100) {
(person: Person, index) in
person.name = "Test Person \(index)"
}
do {
try self.privateObjectContext?.save()
} catch {
print(error)
}
}
在此之後,如果我從我的主要MOC取然後我得到預期100條記錄。
print(mainMOC.hasChanges) //true
let persons = mainMOC.fetchAll(Person)
print(persons.count) //100
但強行崩潰應用程序後主MOC仍然沒有顯示任何變化。
什麼是使用童工情況下,你的情況動機節「異步拯救」?你看到任何併發使用? – Shripada
我有很多數據需要在我的主應用程序中定期保存在後臺。所以看着通過一個孩子MOC異步保存到MOC的選項,然後當用戶完成任務將其存儲在持久存儲中時。當應用程序在任務之間崩潰時,我必須處理該案例,因此問題 – firecast
理想情況下,如果您打算立即將更新寫回到磁盤,則保存父級應立即在子級上下文中保存。 – Shripada