5 // Created by Hori,Masaki on 2017/01/22.
6 // Copyright © 2017年 Hori,Masaki. All rights reserved.
11 private var pDeckContext = 0
13 final class Fleet: NSObject {
16 private let deckController = NSObjectController()
18 private let deckObserveKeys = [
19 "selection.ship_0", "selection.ship_1", "selection.ship_2",
20 "selection.ship_3", "selection.ship_4", "selection.ship_5"
25 guard case 1...4 = number else {
27 print("Fleet number out of range")
35 deckController.entityName = Deck.entityName
36 deckController.managedObjectContext = ServerDataStore.default.context
37 deckController.fetchPredicate = NSPredicate(#keyPath(Deck.id), equal: number)
38 let req = NSFetchRequest<NSFetchRequestResult>()
39 req.entity = NSEntityDescription.entity(forEntityName: Deck.entityName,
40 in: deckController.managedObjectContext!)
41 req.predicate = deckController.fetchPredicate
45 try deckController.fetch(with: req, merge: false)
54 deck = deckController.content as? Deck
55 deckObserveKeys.forEach { deckController.addObserver(self, forKeyPath: $0, context: &pDeckContext) }
60 deckObserveKeys.forEach { deckController.removeObserver(self, forKeyPath: $0) }
64 @objc override class func keyPathsForValuesAffectingValue(forKey key: String) -> Set<String> {
68 case #keyPath(name): return [#keyPath(deck.name)]
70 case #keyPath(id): return [#keyPath(deck.id)]
76 @objc dynamic private(set) var ships: [Ship] = []
79 @objc dynamic var name: String? { return deck?.name }
80 @objc dynamic var id: NSNumber? { return deck?.id as NSNumber? }
82 subscript(_ index: Int) -> Ship? { return deck?[index] }
84 override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) {
86 if context == &pDeckContext {
88 ships = (0..<6).flatMap { return self[$0] }
93 super.observeValue(forKeyPath: keyPath, of: object, change: change, context: context)