OSDN Git Service

処理を簡素にわかりやすくした
authormasakih <masakih@users.sourceforge.jp>
Tue, 30 Jan 2018 15:52:05 +0000 (00:52 +0900)
committermasakih <masakih@users.sourceforge.jp>
Tue, 30 Jan 2018 15:52:05 +0000 (00:52 +0900)
KCD/BattleInformationViewController.swift

index 0bfe54e..9884c6b 100644 (file)
@@ -10,128 +10,113 @@ import Cocoa
 
 class BattleInformationViewController: NSViewController {
     
+    private let notificationObserver = NotificationObserver()
     
-    deinit {
-        ["selection", "selection.no", "content.battleCell"]
-            .forEach { battleContoller.removeObserver(self, forKeyPath: $0) }
-    }
-    
-    @objc let battleManagedObjectContext = TemporaryDataStore.default.context
+    @objc private let battleManagedObjectContext = TemporaryDataStore.default.context
     
-    @IBOutlet var battleContoller: NSObjectController!
-    @IBOutlet weak var cellNumberField: NSTextField!
+    @IBOutlet private var battleContoller: NSObjectController!
+    @IBOutlet private weak var cellNumberField: NSTextField!
     
     override var nibName: NSNib.Name {
         
         return .nibName(instanceOf: self)
     }
-
-    var battle: Battle? {
-        
-        return TemporaryDataStore.default.battle()
-    }
     
-    @objc var cellNumber: Int {
-        
-        return battleContoller.value(forKeyPath: "content.no") as? Int ?? 0
+    private var battle: Battle? {
+        didSet { updateProperties() }
     }
-    
-    var battleCellNumber: Int {
-        
-        return battleContoller.value(forKeyPath: "content.battleCell") as? Int ?? 0
-    }
-    
-    var isBossCell: Bool {
-        
-        return battleContoller.value(forKeyPath: "content.isBossCell") as? Bool ?? false
-    }
-    
-    var fleetName: String? {
-        
-        guard let deckId = battleContoller.value(forKeyPath: "content.deckId") as? Int else { return nil }
-        
-        return ServerDataStore.default.deck(by: deckId)?.name
+    @objc dynamic private var cellNumber: Int = 0
+    private var battleCellNumber: Int = 0
+    private var isBossCell: Bool = false
+    private var deckId: Int = 0 {
+        didSet {
+            fleetName = ServerDataStore.default.deck(by: deckId)?.name
+        }
     }
-    
-    var areaNumber: String? {
-        
-        let mapArea: String = {
-            
-            guard let mapArea = battleContoller.value(forKeyPath: "content.mapArea") as? Int else { return "" }
-            
-            if mapArea > 10 { return "E" }
-            
-            return "\(mapArea)"
-        }()
-        
-        guard mapArea != "" else { return nil }
-        
-        guard let mapInfo = battleContoller.value(forKeyPath: "content.mapInfo") as? Int else { return "" }
+    private var fleetName: String?
+    private var mapArea: Int?
+    private var mapInfo: Int?
+    private var areaNumber: String? {
+        
+        guard let mapInfo = self.mapInfo else { return nil }
+        
+        let mapArea: String
+        switch self.mapArea {
+        case let area? where area > 10: mapArea = "E"
+        case let area?: mapArea = "\(area)"
+        case .none: return nil
+        }
         
         return "\(mapArea)-\(mapInfo)"
     }
-    
-    var areaName: String? {
+    private var areaName: String? {
         
-        guard let mapArea = battleContoller.value(forKeyPath: "content.mapArea") as? Int else { return nil }
-        guard let mapInfo = battleContoller.value(forKeyPath: "content.mapInfo") as? Int else { return nil }
+        guard let mapArea = self.mapArea else { return nil }
+        guard let mapInfo = self.mapInfo else { return nil }
         
         return ServerDataStore.default.mapInfo(area: mapArea, no: mapInfo)?.name
     }
     
-    @objc var sortieString: String? {
+    @objc private var sortieString: String? {
         
-        guard let fleetName = self.fleetName,
-            let areaName = self.areaName,
-            let areaNumber = self.areaNumber else { return nil }
+        guard let fleetName = self.fleetName else { return nil }
+        guard let areaName = self.areaName else { return nil }
+        guard let areaNumber = self.areaNumber else { return nil }
         
         if battleCellNumber == 0 {
             
-            let format = LocalizedStrings.sortieInfomation.string
-            
-            return String(format: format, arguments: [fleetName, areaName, areaNumber])
+            return String(format: LocalizedStrings.sortieInfomation.string,
+                          arguments: [fleetName, areaName, areaNumber])
         }
         if isBossCell {
             
-            let format = LocalizedStrings.battleWithBOSS.string
-            
-            return String(format: format, arguments: [fleetName, battleCellNumber as NSNumber, areaName, areaNumber])
+            return String(format: LocalizedStrings.battleWithBOSS.string,
+                          arguments: [fleetName, battleCellNumber as NSNumber, areaName, areaNumber])
         }
         
-        let format = LocalizedStrings.battleInformation.string
-        
-        return String(format: format, arguments: [fleetName, battleCellNumber as NSNumber, areaName, areaNumber])
+        return String(format: LocalizedStrings.battleInformation.string,
+                      arguments: [fleetName, battleCellNumber as NSNumber, areaName, areaNumber])
     }
     
     override func viewDidLoad() {
         
         super.viewDidLoad()
         
-        ["selection", "selection.no", "content.battleCell"]
-            .forEach { battleContoller.addObserver(self, forKeyPath: $0, context: nil) }
+        notificationObserver
+            .addObserver(forName: .NSManagedObjectContextObjectsDidChange,
+                         object: TemporaryDataStore.default.context,
+                         queue: .main) { notification in
+                            
+                            if let battle: Battle = notification.insertedManagedObjects().first {
+                                
+                                self.battle = battle
+                            }
+                            
+                            if let _: Battle = notification.updatedManagedObjects().first {
+                                
+                                self.updateProperties()
+                            }
+                            
+                            if let _: Battle = notification.deletedManagedObjects().first {
+                                
+                                self.battle = nil
+                            }
+        }
         
         #if DEBUG
             cellNumberField.isHidden = false
         #endif
     }
     
-    override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey: Any]?, context: UnsafeMutableRawPointer?) {
+    private func updateProperties() {
         
-        if keyPath == "selection" || keyPath == "content.battleCell" {
-            
-            notifyChangeValue(forKey: #keyPath(sortieString))
-            
-            return
-        }
+        cellNumber = battle?.no ?? 0
+        battleCellNumber = battle?.battleCell as? Int ?? 0
+        isBossCell = battle?.isBossCell ?? false
+        deckId = battle?.deckId ?? 0
+        mapArea = battle?.mapArea
+        mapInfo = battle?.mapInfo
         
-        if keyPath == "selection.no" {
-            
-            notifyChangeValue(forKey: #keyPath(cellNumber))
-            
-            return
-        }
-        
-        super.observeValue(forKeyPath: keyPath, of: object, change: change, context: context)
+        notifyChangeValue(forKey: #keyPath(sortieString))
     }
-    
 }