web-dev-qa-db-ja.com

NSManagedObjectContext(): `init()`はiOS 9.0で廃止されました:-initWithConcurrencyTypeを使用してください

私は 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も廃止されたため、MainQueueConcurrencyTypePrivateQueueConcurrencyTypeが残ります。これら2つの違いは何ですか?また、どちらを使用するかをどのように選択する必要がありますか?私は このドキュメント を読みましたが、本当にわかりませんでした。

25
Suragch

基本的に、常に少なくとも1つのNSMainQueueConcurrencyTypeのコンテキストと、多くのNSPrivateQueueConcurrencyTypeのコンテキストがあります。 NSPrivateQueueConcurrencyTypeは通常、バックグラウンドで物事をコアデータに保存またはフェッチするために使用されます(レコードをWebサービスと同期する場合など)。

NSMainQueueConcurrencyTypeは、NSFetchedResultsControllerでの使用に最適なメインキューに関連付けられたコンテキストを作成します。

デフォルトのコアデータスタックはNSMainQueueConcurrencyTypeを使用して単一のコンテキストを使用しますが、複数のNSPrivateQueueConcurrencyTypeを利用してUIに影響を与えない作業を行うことで、はるかに優れたアプリを作成できます。

27
DBoyer

これら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()
        }
    }
}
7
Hong Yean Chua