OSDN Git Service

ShipSlotObserverを使用するように変更
[kcd/KCD.git] / KCD / FleetManager.swift
1 //
2 //  FleetManager.swift
3 //  KCD
4 //
5 //  Created by Hori,Masaki on 2017/01/22.
6 //  Copyright © 2017年 Hori,Masaki. All rights reserved.
7 //
8
9 import Cocoa
10
11 final class FleetManager: NSObject {
12     
13     override init() {
14         
15         super.init()
16         
17         setupFleets()
18     }
19     
20     @objc private(set) var fleets: [Fleet] = []
21     private var fleetController: NSArrayController!
22     
23     override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey: Any]?, context: UnsafeMutableRawPointer?) {
24         
25         if keyPath == "arrangedObjects.ships" {
26             
27             setNewFleetNumberToShip()
28             return
29         }
30         
31         super.observeValue(forKeyPath: keyPath, of: object, change: change, context: context)
32     }
33     
34     private func setupFleetController() {
35         
36         fleetController = NSArrayController(content: fleets)
37         fleetController.addObserver(self, forKeyPath: "arrangedObjects.ships", context: nil)
38     }
39     
40     private func setupFleets() {
41         
42         fleets = (1...4).flatMap { Fleet(number: $0) }
43         
44         guard fleets.count == 4 else {
45             
46             return Logger.shared.log("Can not create Fleet")
47         }
48         
49         if fleets[0].ships.isEmpty {
50             
51             NotificationCenter.default
52                 .addObserverOnce(forName: .PortAPIReceived, object: nil, queue: nil) { _ in
53                     
54                     DispatchQueue.main.async(execute: self.setupFleetController)
55                     DispatchQueue.main.async(execute: self.setNewFleetNumberToShip)
56             }
57             
58         } else {
59             
60             setupFleetController()
61         }
62     }
63     
64     private func setNewFleetNumberToShip() {
65         
66         let store = ServerDataStore.oneTimeEditor()
67         
68         // clear all
69         store.shipsInFleet().forEach { $0.fleet = 0 as NSNumber }
70         
71         // set
72         fleets.enumerated().forEach { (index, fleet) in
73             
74             fleet.ships.forEach {
75                 
76                 store.ship(by: $0.id)?.fleet = (index + 1) as NSNumber
77             }
78         }
79     }
80 }