OSDN Git Service

bf74b752e41966672cf7b8f806ed844f9a760372
[kcd/KCD.git] / KCD / Fleet.swift
1 //
2 //  Fleet.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 DeckObserver {
12     
13     private let deck: Deck
14     private let handler: (Deck) -> Void
15     
16     private var observation: [NSKeyValueObservation] = []
17     
18     init(deck: Deck, handler: @escaping (Deck) -> Void) {
19         
20         self.deck = deck
21         self.handler = handler
22         
23         observation += [deck.observe(\Deck.ship_0, changeHandler: observeHandler)]
24         observation += [deck.observe(\Deck.ship_1, changeHandler: observeHandler)]
25         observation += [deck.observe(\Deck.ship_2, changeHandler: observeHandler)]
26         observation += [deck.observe(\Deck.ship_3, changeHandler: observeHandler)]
27         observation += [deck.observe(\Deck.ship_4, changeHandler: observeHandler)]
28         observation += [deck.observe(\Deck.ship_5, changeHandler: observeHandler)]
29         observation += [deck.observe(\Deck.ship_6, changeHandler: observeHandler)]
30         
31         handler(deck)
32     }
33     
34     private func observeHandler(_: Deck, _:NSKeyValueObservedChange<Int>) {
35         
36         handler(deck)
37     }
38 }
39
40 final class Fleet: NSObject {
41     
42     let fleetNumber: Int
43     
44     private var observer: DeckObserver?
45     
46     @objc dynamic private(set) var ships: [Ship] = []
47     private var deck: Deck?
48     
49     let store = ServerDataStore.default
50     
51     init?(number: Int) {
52         
53         guard case 1...4 = number else {
54             
55             Logger.shared.log("Fleet number out of range")
56             
57             return nil
58         }
59         
60         fleetNumber = number
61         
62         super.init()
63         
64         if let deck = store.sync(execute: { self.store.deck(by: number) }) {
65             
66             self.setupDeck(deck: deck)
67             
68             return
69         }
70         
71         ServerDataStore.default
72             .future { _ -> Deck? in
73                 
74                 guard let deck = self.store.sync(execute: { self.store.deck(by: number) }) else {
75                     
76                     return .none
77                 }
78                 
79                 return deck
80             }
81             .onSuccess { deck in
82                 
83                 self.setupDeck(deck: deck)
84             }
85             .onFailure { error in
86                 
87                 Logger.shared.log("\(error)")
88         }
89     }
90     
91     subscript(_ index: Int) -> Ship? {
92         
93         return store.sync { self.deck?[index] }
94     }
95     
96     private func setupDeck(deck: Deck) {
97         
98         self.deck = deck
99         self.observer = DeckObserver(deck: deck) { [weak self] in
100             
101             self?.setupShips(deck: $0)
102         }
103     }
104     
105     private func setupShips(deck: Deck) {
106         
107         ships = store.sync { deck[0...6] }
108     }
109 }