OSDN Git Service

ShipSlotObserverを使用するように変更
[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 private var pDeckContext = 0
12
13 final class Fleet: NSObject {
14     
15     let fleetNumber: Int
16     private let deckController = NSObjectController()
17     
18     private let deckObserveKeys = [
19         "selection.ship_0", "selection.ship_1", "selection.ship_2",
20         "selection.ship_3", "selection.ship_4", "selection.ship_5",
21         "selection.ship_6"
22     ]
23     
24     init?(number: Int) {
25         
26         guard case 1...4 = number else {
27             
28             Logger.shared.log("Fleet number out of range")
29             return nil
30         }
31         
32         fleetNumber = number
33         
34         super.init()
35         
36         deckController.entityName = Deck.entityName
37         deckController.managedObjectContext = ServerDataStore.default.context
38         deckController.fetchPredicate = NSPredicate(#keyPath(Deck.id), equal: number)
39         let req = NSFetchRequest<NSFetchRequestResult>()
40         req.entity = NSEntityDescription.entity(forEntityName: Deck.entityName,
41                                                 in: deckController.managedObjectContext!)
42         req.predicate = deckController.fetchPredicate
43         
44         do {
45             
46             try deckController.fetch(with: req, merge: false)
47             
48         } catch {
49             
50             Logger.shared.log("Fetch error")
51             return nil
52         }
53         
54         deck = deckController.content as? Deck
55         deckObserveKeys.forEach { deckController.addObserver(self, forKeyPath: $0, context: &pDeckContext) }
56     }
57     
58     deinit {
59         
60         deckObserveKeys.forEach { deckController.removeObserver(self, forKeyPath: $0) }
61     }
62     
63     @objc override class func keyPathsForValuesAffectingValue(forKey key: String) -> Set<String> {
64         
65         switch key {
66             
67         case #keyPath(name): return [#keyPath(deck.name)]
68             
69         case #keyPath(id): return [#keyPath(deck.id)]
70             
71         default: return []
72         }
73     }
74     
75     @objc dynamic private(set) var ships: [Ship] = []
76     @objc var deck: Deck?
77     
78     @objc dynamic var name: String? { return deck?.name }
79     @objc dynamic var id: NSNumber? { return deck?.id as NSNumber? }
80     
81     subscript(_ index: Int) -> Ship? { return deck?[index] }
82     
83     override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey: Any]?, context: UnsafeMutableRawPointer?) {
84         
85         if context == &pDeckContext {
86             
87             ships = (0..<Deck.maxShipCount).flatMap { self[$0] }
88             
89             return
90         }
91         
92         super.observeValue(forKeyPath: keyPath, of: object, change: change, context: context)
93     }
94 }