私は 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
が残ります。これら2つの違いは何ですか?また、どちらを使用するかをどのように選択する必要がありますか?私は このドキュメント を読みましたが、本当にわかりませんでした。
基本的に、常に少なくとも1つのNSMainQueueConcurrencyType
のコンテキストと、多くのNSPrivateQueueConcurrencyType
のコンテキストがあります。 NSPrivateQueueConcurrencyType
は通常、バックグラウンドで物事をコアデータに保存またはフェッチするために使用されます(レコードをWebサービスと同期する場合など)。
NSMainQueueConcurrencyType
は、NSFetchedResultsController
での使用に最適なメインキューに関連付けられたコンテキストを作成します。
デフォルトのコアデータスタックはNSMainQueueConcurrencyType
を使用して単一のコンテキストを使用しますが、複数のNSPrivateQueueConcurrencyType
を利用してUIに影響を与えない作業を行うことで、はるかに優れたアプリを作成できます。
これら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()
}
}
}