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 Logger.shared.log("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)
49 Logger.shared.log("Fetch error")
53 deck = deckController.content as? Deck
54 deckObserveKeys.forEach { deckController.addObserver(self, forKeyPath: $0, context: &pDeckContext) }
59 deckObserveKeys.forEach { deckController.removeObserver(self, forKeyPath: $0) }
62 @objc override class func keyPathsForValuesAffectingValue(forKey key: String) -> Set<String> {
66 case #keyPath(name): return [#keyPath(deck.name)]
68 case #keyPath(id): return [#keyPath(deck.id)]
74 @objc dynamic private(set) var ships: [Ship] = []
77 @objc dynamic var name: String? { return deck?.name }
78 @objc dynamic var id: NSNumber? { return deck?.id as NSNumber? }
80 subscript(_ index: Int) -> Ship? { return deck?[index] }
82 override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey: Any]?, context: UnsafeMutableRawPointer?) {
84 if context == &pDeckContext {
86 ships = (0..<6).flatMap { self[$0] }
91 super.observeValue(forKeyPath: keyPath, of: object, change: change, context: context)