OSDN Git Service

Futureを導入
authormasakih <masakih@users.sourceforge.jp>
Sat, 13 Jan 2018 13:01:36 +0000 (22:01 +0900)
committermasakih <masakih@users.sourceforge.jp>
Sun, 14 Jan 2018 08:46:34 +0000 (17:46 +0900)
KCD.xcodeproj/project.pbxproj
KCD/Future.swift [new file with mode: 0644]

index 4f543b2..ff3bca6 100644 (file)
                F4649FC91DBC51EF0097AEBF /* ScreenshotListViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = F4649FCB1DBC51EF0097AEBF /* ScreenshotListViewController.xib */; };
                F4649FCE1DBC52600097AEBF /* ScreenshotDetailViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = F4649FD01DBC52600097AEBF /* ScreenshotDetailViewController.xib */; };
                F4649FD31DBC52A50097AEBF /* ScreenshotEditorViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = F4649FD51DBC52A50097AEBF /* ScreenshotEditorViewController.xib */; };
+               F46C00F1200A0D3400A066E2 /* Future.swift in Sources */ = {isa = PBXBuildFile; fileRef = F46C00F0200A0D3400A066E2 /* Future.swift */; };
                F46F104918ABAC910063E503 /* KCD.xcdatamodeld in Sources */ = {isa = PBXBuildFile; fileRef = F46F104718ABAC910063E503 /* KCD.xcdatamodeld */; };
                F46FEA3F1F81285D00E2427C /* Localizable.swift in Sources */ = {isa = PBXBuildFile; fileRef = F46FEA3E1F81285D00E2427C /* Localizable.swift */; };
                F46FEA411F8128BB00E2427C /* LocalizedStrings.swift in Sources */ = {isa = PBXBuildFile; fileRef = F46FEA401F8128BB00E2427C /* LocalizedStrings.swift */; };
                F4649FD91DBC54270097AEBF /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/ScreenshotListViewController.xib; sourceTree = "<group>"; };
                F4649FDA1DBC54320097AEBF /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/ScreenshotDetailViewController.xib; sourceTree = "<group>"; };
                F4649FDB1DBC543A0097AEBF /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/ScreenshotEditorViewController.xib; sourceTree = "<group>"; };
+               F46C00F0200A0D3400A066E2 /* Future.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Future.swift; sourceTree = "<group>"; };
                F46F104818ABAC910063E503 /* KCD.xcdatamodel */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcdatamodel; path = KCD.xcdatamodel; sourceTree = "<group>"; };
                F46FEA3E1F81285D00E2427C /* Localizable.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Localizable.swift; sourceTree = "<group>"; };
                F46FEA401F8128BB00E2427C /* LocalizedStrings.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LocalizedStrings.swift; sourceTree = "<group>"; };
                                F48883441F2E095F0069E0C3 /* DefaultSettings.swift */,
                                F46FEA3E1F81285D00E2427C /* Localizable.swift */,
                                F46FEA401F8128BB00E2427C /* LocalizedStrings.swift */,
+                               F46C00F0200A0D3400A066E2 /* Future.swift */,
                                F41AA4771FDEDCD200FFFBD1 /* DataExtension.swift */,
                                F40F97701E68536400AE81BB /* FileManagerExtension.swift */,
                                F44AA26A1E82AD2E00EED8BE /* NSObjectExtension.swift */,
                                F42A8FD81E3DEAA00099DC1D /* NyukyoDock.swift in Sources */,
                                F4AA591A1E1CE2EA001667AF /* SlotItemEquipTypeTransformer.swift in Sources */,
                                F47C3E9C1E5DC94E00D97449 /* MasterShipMapper.swift in Sources */,
+                               F46C00F1200A0D3400A066E2 /* Future.swift in Sources */,
                                F44BC6C11E221293004644E3 /* AirCorpsChangeNameCommand.swift in Sources */,
                                F4CF25BE1E361F4600C02A66 /* NyukyoDockStatus.swift in Sources */,
                                F490978B1E1B38F00085A45D /* TiledImageView.swift in Sources */,
diff --git a/KCD/Future.swift b/KCD/Future.swift
new file mode 100644 (file)
index 0000000..b30ba78
--- /dev/null
@@ -0,0 +1,73 @@
+//
+//  Future.swift
+//  KCD
+//
+//  Created by Hori,Masaki on 2018/01/13.
+//  Copyright © 2018年 Hori,Masaki. All rights reserved.
+//
+
+import Foundation
+
+let watingQueue = DispatchQueue(label: "Future")
+class Future<T> {
+    
+    private let queue: DispatchQueue
+    private let semaphore = DispatchSemaphore(value: 1)
+    
+    private(set) var value: T?
+    private(set) var error: Error?
+    
+    init(queue: DispatchQueue = watingQueue) {
+        
+        self.queue = queue
+        
+        self.semaphore.wait()
+    }
+    deinit {
+        semaphore.signal()
+    }
+    
+    @discardableResult
+    func onSuccess(block: @escaping (T) -> Void) -> Future<T> {
+        
+        queue.async {
+            
+            self.semaphore.wait()
+            self.value.map(block)
+            self.semaphore.signal()
+        }
+        
+        return self
+    }
+    
+    @discardableResult
+    func onFailure(block: @escaping (Error) -> Void) -> Future<T> {
+        
+        queue.async {
+            
+            self.semaphore.wait()
+            self.error.map(block)
+            self.semaphore.signal()
+        }
+        
+        return self
+    }
+    
+    func success(_ value: T) {
+        
+        guard self.value == nil else { return }
+        guard self.error == nil else { return }
+        
+        self.value = value
+        semaphore.signal()
+    }
+    
+    func failure(_ error: Error) {
+        
+        guard self.value == nil else { return }
+        guard self.error == nil else { return }
+        
+        self.error = error
+        semaphore.signal()
+    }
+}