[iOS 10] CoreDataの変更内容をまとめてみました。
CoreData
こんにちは!
モバイルアプリサービス部の田中孝明です。
CoreDataといえば、macOS / iOSアプリ開発において、標準的なローカルDBとして利用されてきましたが、比較的レガシーな構造なため、学習コストが高いことでプロジェクトへの組み込みを敬遠されることもありました。
長らくアップデートされることが無かったのですが、iOS 10にて若干の修正がされました。
今回は気になった修正内容を記述していきたいと思います。
モデルの定義の変更
モデルの定義にClass Definition
が追加されました。
Xcode 8.0以前ではCoreDataのエンティティを作成すると、NSManagedObject
を継承したモデルクラスを別途作成することが多かったと思います。(無くても良いが、メンテナンス性に難がある)
Class Definition
を指定することで、以下のようなNSManagedObject
を継承した拡張クラスとして扱えるようになります。
Event+CoreDataClass.swift
import Foundation import CoreData @objc(Event) public class Event: NSManagedObject { }
このエンティティの定義の変更によって、エンティティの作成と更新の煩雑な作業が解消されました。
Generics
Fetch処理にGenericsでモデルの型を指定するようになりました。
前のバージョンまではNSFetchRequest
のentityName
で対象のモデルを文字列で指定していました。
let request = NSFetchRequest(entityName: "Event")
Swift 3.0からはGenericsでモデルの型を指定できるようになりました。
let fetchRequest: NSFetchRequest<Event> = Event.fetchRequest()
NSManagedObject
を継承したモデルクラスであれば、fetchRequest
メソッドが備わっていますので、NSFetchRequest
を生成することが可能です。
UITableViewController
やUICollectionViewController
と親和性の高い、NSFetchedResultsController
も同様にGenericsでモデルの型を指定できるようになりました。
var fetchedResultsController: NSFetchedResultsController<Event> { ... }
ここで注意すべき点ですが、NSFetchRequest
とNSFetchedResultsController
はSwift 3.0でもNS
prefixが付いているので、次回バージョン以降で変更される可能性はあります。
並列書き込み処理の変更
PersistentStoreCoordinator
が別々のManagedObjectContext
からDBへの並列書き込みが発生した場合、DBをロックするタイミングが変更されました。
こちらに関しては検証プログラムを用意する必要がありますので、別の機会で検証したいと思います。
まとめ
最近ではRealmを採用するプロジェクトも増え、学習コストが比較的高めのCoreDataは敬遠されがちです。
しかし、開発環境が標準で備えているローカルDBは、学習しておくことで最新のOSなどの対応を迅速に行うことが可能です。
CoreDataの基礎についてはいずれかのタイミングで記事にしたいと思います。