OSDN Git Service

NotificationCenterからFuture<T>を取得できるようにした
authormasakih <masakih@users.sourceforge.jp>
Wed, 17 Jan 2018 14:17:42 +0000 (23:17 +0900)
committermasakih <masakih@users.sourceforge.jp>
Wed, 17 Jan 2018 14:17:42 +0000 (23:17 +0900)
KCD/DockInformationFutures.swift
KCD/Future.swift

index ebdb658..2fb05f8 100644 (file)
@@ -48,10 +48,10 @@ func createDockInformationFuture<T: DockInformationFutureCreatable>(number: Int)
         return future
     }
     
-    future.waitingCoreData { _ in
+    return ServerDataStore.default.future { _ -> Result<T> in
         
         guard T.alreadyHasData(for: number) else { return .none }
-            
+        
         guard let status = T.init(number: number) else {
             
             return .error(DockInformationError.canNotCreate(String(describing: T.self)))
@@ -59,8 +59,6 @@ func createDockInformationFuture<T: DockInformationFutureCreatable>(number: Int)
         
         return .value(status)
     }
-    
-    return future
 }
 
 extension MissionStatus: DockInformationFutureCreatable {
index afe50d8..5fa95c0 100644 (file)
@@ -16,7 +16,7 @@ enum Result<T> {
     case error(Error)
 }
 
-let watingQueue = DispatchQueue(label: "Future", attributes: .concurrent)
+private let watingQueue = DispatchQueue(label: "Future", attributes: .concurrent)
 class Future<T> {
     
     private let queue: DispatchQueue
@@ -89,49 +89,56 @@ class Future<T> {
     }
 }
 
-extension Future {
-    
+
+extension NotificationCenter {
     
-    /// Notificationã\82\92å¾\85ã\81£ã\81¦å\80¤ã\82\92設å®\9aã\81\99ã\82\8b
+    /// Notificationã\82\92å¾\85ã\81£ã\81¦å\80¤ã\81\8c設å®\9aã\81\95ã\82\8cã\82\8b Future<T>ã\82\92è¿\94ã\81\99
     ///
     /// - Parameters:
-    ///   - center: NotificationCenter. default is NotificationCenter.default
     ///   - name: Notification.Name
     ///   - object: 監視対象
     ///   - block:
     ///     Parameters: Notification
     ///     Returns: `Result<T>` : 成功時は `.value<T>`, エラー時は `.error<Error>`, 監視を継続するときは `.none`を返す
-    func waitingNotification(_ center: NotificationCenter = .default, name: Notification.Name, object: Any?, block: @escaping (Notification) -> Result<T>) {
+    /// - Returns: Notificationによって値が設定される Future<T>
+    func future<T>(name: Notification.Name, object: Any?, block: @escaping (Notification) -> Result<T>) -> Future<T> {
+        
+        let future = Future<T>()
         
         weak var token: NSObjectProtocol?
-        token = center
+        token = self
             .addObserver(forName: name,
                          object: object,
                          queue: nil) { notification in
                             
-                            
                             switch block(notification) {
                                 
-                            case .value(let val): self.success(val)
+                            case .value(let val): future.success(val)
                                 
                             case .none: return
                                 
-                            case .error(let error): self.failure(error)
+                            case .error(let error): future.failure(error)
                             }
                             
                             token.map(NotificationCenter.default.removeObserver)
         }
+        
+        return future
     }
+}
+
+extension CoreDataProvider {
     
-    /// å\88\9då\9b\9eèµ·å\8b\95æ\99\82ã\81ªã\81©ã\81«ã\83\87ã\83¼ã\82¿ã\81\8cã\81ªã\81\84æ\99\82ã\81ªã\81©ã\81«CoreDataã\82\92ç\9b£è¦\96ã\81\99ã\82\8b
+    /// å\88\9då\9b\9eèµ·å\8b\95æ\99\82ã\81ªã\81©ã\81«ã\83\87ã\83¼ã\82¿ã\81\8cã\81ªã\81\84æ\99\82ã\81ªã\81©ã\81«CoreDataã\82\92ç\9b£è¦\96ã\81\97å\80¤ã\81\8c設å®\9aã\81\95ã\82\8cã\82\8b Future<T>ã\82\92è¿\94ã\81\99
     ///
     /// - Parameters:
-    ///   - coreData: 監視対象
     ///   - block:
     ///     Parameters: Notification (NSManagedObjectContextObjectsDidChange)
     ///     Returns: `Result<T>` : 成功時は `.value<T>`, エラー時は `.error<Error>`, 監視を継続するときは `.none`を返す
-    func waitingCoreData(_ coreData: CoreDataProvider = ServerDataStore.default, block: @escaping (Notification) -> Result<T>) {
+    /// - Returns: CoreDataの更新で値が設定される Future<T>
+    func future<T>(block: @escaping (Notification) -> Result<T>) -> Future<T> {
         
-        waitingNotification(name: .NSManagedObjectContextObjectsDidChange, object: coreData.context, block: block)
+        return NotificationCenter.default
+            .future(name: .NSManagedObjectContextObjectsDidChange, object: self.context, block: block)
     }
 }