OSDN Git Service

Loggerを利用するようにした
[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 extension Notification.Name {
12     
13     static let DidPrepareFleet = Notification.Name("com.masakih.KCD.Notification.DidPrepareFleet")
14 }
15
16 final class FleetManager: NSObject {
17     
18     override init() {
19         
20         super.init()
21         
22         setupFleets()
23     }
24     
25     @objc private(set) var fleets: [Fleet] = []
26     private var fleetController: NSArrayController!
27     
28     override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey: Any]?, context: UnsafeMutableRawPointer?) {
29         
30         if keyPath == "arrangedObjects.ships" {
31             
32             setNewFleetNumberToShip()
33             return
34             
35         }
36         
37         super.observeValue(forKeyPath: keyPath, of: object, change: change, context: context)
38     }
39     
40     private func setupFleetController() {
41         
42         fleetController = NSArrayController(content: fleets)
43         fleetController.addObserver(self, forKeyPath: "arrangedObjects.ships", context: nil)
44     }
45     
46     private func setupFleets() {
47         
48         fleets = (1...4).flatMap { Fleet(number: $0) }
49         
50         guard fleets.count == 4 else {
51             
52             return Logger.shared.log("Can not create Fleet")
53         }
54         
55         if fleets[0].ships.isEmpty {
56             
57             let center = NotificationCenter.default
58             weak var token: NSObjectProtocol!
59             token = center.addObserver(forName: .PortAPIReceived, object: nil, queue: nil) {_ in
60                 
61                 center.removeObserver(token)
62                 self.setupFleetController()
63                 center.post(name: .DidPrepareFleet, object: self)
64             }
65             
66         } else {
67             
68             setupFleetController()
69             
70         }
71     }
72     
73     private func setNewFleetNumberToShip() {
74         
75         let store = ServerDataStore.oneTimeEditor()
76         
77         // clear all
78         store.shipsInFleet().forEach { $0.fleet = 0 as NSNumber }
79         
80         // set
81         fleets.enumerated().forEach { (index, fleet) in
82             
83             fleet.ships.forEach {
84                 
85                 store.ship(by: $0.id)?.fleet = (index + 1) as NSNumber
86             }
87         }
88     }
89 }