2 // CoreDataProviderExtension.swift
5 // Created by Hori,Masaki on 2018/01/21.
6 // Copyright © 2018年 Hori,Masaki. All rights reserved.
12 extension CoreDataProvider {
14 /// 初回起動時などにデータがない時などにCoreDataを監視し値が設定される Future<T>を返す
18 /// Parameters: Notification (NSManagedObjectContextObjectsDidChange)
19 /// Returns: `T?` : 成功時は `T`, エラー時は例外を発生させる。 監視を継続するときは `nil`を返す
20 /// - Returns: CoreDataの更新で値が設定される Future<T>
21 func future<T>(block: @escaping (Notification) throws -> T?) -> Future<T> {
23 return NotificationCenter.default
24 .future(name: .NSManagedObjectContextObjectsDidChange, object: self.context, block: block)
28 extension Notification {
30 struct ChangedType: OptionSet {
34 static let inserted = ChangedType(rawValue: 0x0001)
35 static let updated = ChangedType(rawValue: 0x0002)
36 static let deleted = ChangedType(rawValue: 0x0004)
39 func insertedManagedObjects<T: NSManagedObject>() -> [T] {
41 return managedObjects(infoKey: NSInsertedObjectsKey)
44 func updatedManagedObjects<T: NSManagedObject>() -> [T] {
46 return managedObjects(infoKey: NSUpdatedObjectsKey)
49 func deletedManagedObjects<T: NSManagedObject>() -> [T] {
51 return managedObjects(infoKey: NSDeletedObjectsKey)
54 func changedManagedObjects<T: NSManagedObject>(type: ChangedType) -> [T] {
56 let inserted: [T] = type.contains(.inserted) ? insertedManagedObjects() : []
57 let updated: [T] = type.contains(.updated) ? updatedManagedObjects() : []
58 let deleted: [T] = type.contains(.deleted) ? deletedManagedObjects() : []
60 return inserted + updated + deleted
63 private func managedObjects<T: NSManagedObject>(infoKey: String) -> [T] {
65 guard let userInfo = self.userInfo as? [String: Any] else {
70 let inserted = userInfo[infoKey] as? Set<NSManagedObject>
72 return inserted?.compactMap({ $0 as? T }) ?? []