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 {
17 private let deckObserveKeys = [
18 "selection.ship_0", "selection.ship_1", "selection.ship_2",
19 "selection.ship_3", "selection.ship_4", "selection.ship_5"
24 guard case 1...4 = number else {
26 print("Fleet number out of range")
31 deckController = NSObjectController()
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 ["deck.name"]
70 case #keyPath(id): return ["deck.id"]
76 @objc dynamic private(set) var ships: [Ship] = []
77 private let deckController: NSObjectController
78 @objc weak var deck: Deck?
80 @objc dynamic var name: String? { return deck?.name }
81 @objc dynamic var id: NSNumber? { return deck?.id as NSNumber? }
83 subscript(_ index: Int) -> Ship? { return deck?[index] }
85 override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) {
87 if context == &pDeckContext {
89 ships = (0..<6).flatMap { return self[$0] }
94 super.observeValue(forKeyPath: keyPath, of: object, change: change, context: context)