Swift 2 migration saveContext() in appDelegate

后端 未结 2 1550
执笔经年
执笔经年 2020-12-15 05:11

I have just downloaded the new Xcode 7.0 beta and did a migration from Swift 1.2 to Swift 2. The migration apparently did not change the whole code, in fact a method saveCon

2条回答
  •  -上瘾入骨i
    2020-12-15 06:03

    The answer by 0x7fffffff is correct, but to improve upon Apple's boilerplate code, you can catch the specific error in the catch block using catch let error as NSError like so:

    func saveContext () {
        if managedObjectContext.hasChanges {
            do {
                try managedObjectContext.save()
            } catch let error as NSError {
    
                NSLog("Unresolved error \(error), \(error.userInfo)")
                // Handle Error
            }
        }
    }
    

    The best practice is to use the var error witch will still be available if you just use it this way :

    func saveContext () {
            if managedObjectContext.hasChanges {
                do {
                    try managedObjectContext.save()
                } catch {
                    NSLog("Unresolved error \(error), \(error.userInfo)")
                    // Handle Error
                }
            }
        }
    

    In the same way, if you are sure that managedObjectContext.save() will not throw an exception, the code is slimmed down to:

    func saveContext () {
         if managedObjectContext.hasChanges {
            try! managedObjectContext.save()
         }
    }
    

    And to extrapolate on why managedObjectContext is not optional in the Swift 2 code, it is because the NSManagedObject(concurrencyType:) is an initializer that does not fail. In Xcode 6, the boilerplate code returned an optional context if the NSPersistentStoreCoordinator is nil, but you can handle this easily by checking.

    lazy var managedObjectContext: NSManagedObjectContext = {
        let coordinator = self.persistentStoreCoordinator
        var moc = NSManagedObjectContext(concurrencyType: .MainQueueConcurrencyType)
        moc.persistentStoreCoordinator = coordinator
        return moc
    }()
    

提交回复
热议问题