5 // Created by Hori,Masaki on 2018/01/13.
6 // Copyright © 2018年 Hori,Masaki. All rights reserved.
19 let watingQueue = DispatchQueue(label: "Future", attributes: .concurrent)
22 private let queue: DispatchQueue
23 private let semaphore = DispatchSemaphore(value: 1)
25 private var result: Result<T> = .none
27 init(queue: DispatchQueue = watingQueue) {
38 func onSuccess(block: @escaping (T) -> Void) -> Future<T> {
43 if case .value(let value) = self.result { block(value) }
44 self.semaphore.signal()
51 func onFailure(block: @escaping (Error) -> Void) -> Future<T> {
56 if case .error(let error) = self.result { block(error) }
57 self.semaphore.signal()
63 func success(_ value: T) {
68 Logger.shared.log("multi call success(_:)")
72 result = .value(value)
77 func failure(_ error: Error) {
82 Logger.shared.log("multi call failure(_:)")
86 result = .error(error)
95 /// Notificationを待って値を設定する
98 /// - center: NotificationCenter. default is NotificationCenter.default
99 /// - name: Notification.Name
102 /// Parameters: Notification
103 /// Returns: `Result<T>` : 成功時は `.value<T>`, エラー時は `.error<Error>`, 監視を継続するときは `.none`を返す
104 func waitingNotification(_ center: NotificationCenter = .default, name: Notification.Name, object: Any?, block: @escaping (Notification) -> Result<T>) {
106 weak var token: NSObjectProtocol?
108 .addObserver(forName: name,
110 queue: nil) { notification in
113 switch block(notification) {
115 case .value(let val): self.success(val)
119 case .error(let error): self.failure(error)
122 token.map(NotificationCenter.default.removeObserver)
126 /// 初回起動時などにデータがない時などにCoreDataを監視する
131 /// Parameters: Notification (NSManagedObjectContextObjectsDidChange)
132 /// Returns: `Result<T>` : 成功時は `.value<T>`, エラー時は `.error<Error>`, 監視を継続するときは `.none`を返す
133 func waitingCoreData(_ coreData: CoreDataProvider = ServerDataStore.default, block: @escaping (Notification) -> Result<T>) {
135 waitingNotification(name: .NSManagedObjectContextObjectsDidChange, object: coreData.context, block: block)