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))
}
-
}