Подтвердить что ты не робот

NSManagedObjectContext(): `init()` устарел в iOS 9.0: Use -initWithConcurrencyType

Я работал через Core Data Stack в Swift - Demystified, но когда я добрался до строки

self.context = NSManagedObjectContext()

Я получил предупреждение

`init()` was deprecated in iOS 9.0: Use -initWithConcurrencyType: instead

Я вижу, что для self.context =

можно сделать одно из следующих действий:
NSManagedObjectContext(concurrencyType: NSManagedObjectContextConcurrencyType.ConfinementConcurrencyType)
NSManagedObjectContext(concurrencyType: NSManagedObjectContextConcurrencyType.MainQueueConcurrencyType)
NSManagedObjectContext(concurrencyType: NSManagedObjectContextConcurrencyType.PrivateQueueConcurrencyType)

но поскольку ConfinementConcurrencyType также устарел, теперь меня оставляют MainQueueConcurrencyType и PrivateQueueConcurrencyType. В чем разница между этими двумя и как я должен выбрать, какой из них использовать? Я прочитал эту документацию, но я действительно не понял.

4b9b3361

Ответ 1

У вас по существу всегда будет как минимум 1 контекст с NSMainQueueConcurrencyType и многими контекстами с NSPrivateQueueConcurrencyType. NSPrivateQueueConcurrencyType обычно используется для сохранения или получения данных для основных данных в фоновом режиме (например, при попытке синхронизации записей с веб-службой).

NSMainQueueConcurrencyType создает контекст, связанный с основной очередью, которая идеально подходит для использования с NSFetchedResultsController.

По умолчанию основной стек данных использует один контекст с NSMainQueueConcurrencyType, но вы можете создать гораздо лучшее приложение, используя несколько NSPrivateQueueConcurrencyType для выполнения любой работы, которая не влияет на пользовательский интерфейс.

Ответ 2

Замените эти две функции следующим образом:

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
    var managedObjectContext = NSManagedObjectContext(concurrencyType: .MainQueueConcurrencyType)
    managedObjectContext.persistentStoreCoordinator = coordinator
    return managedObjectContext
    }()

// MARK: - Core Data Saving support

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()
        }
    }
}