OSDN Git Service

Swift4.0にコンバートした
[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 { return print("Can not create Fleet") }
51         
52         if fleets[0].ships.isEmpty {
53             
54             let center = NotificationCenter.default
55             var token: NSObjectProtocol!
56             token = center.addObserver(forName: .PortAPIReceived, object: nil, queue: nil) {_ in
57                 
58                 center.removeObserver(token)
59                 self.setupFleetController()
60                 center.post(name: .DidPrepareFleet, object: self)
61             }
62             
63         } else {
64             
65             setupFleetController()
66             
67         }
68     }
69     
70     private func setNewFleetNumberToShip() {
71         
72         let store = ServerDataStore.oneTimeEditor()
73         
74         // clear all
75         store.shipsInFleet().forEach { $0.fleet = 0 as NSNumber }
76         
77         // set
78         fleets.enumerated().forEach { (index, fleet) in
79             
80             fleet.ships.forEach {
81                 
82                 store.ship(by: $0.id)?.fleet = (index + 1) as NSNumber
83             }
84         }
85     }
86 }