5 // Created by Hori,Masaki on 2016/02/11.
6 // Copyright © 2016年 Hori,Masaki. All rights reserved.
11 #import "HMServerDataStore.h"
13 #import "HMKCDeck+Extension.h"
14 #import "HMKCShipObject+Extensions.h"
17 @property (strong) NSNumber *fleetNumber;
18 @property (strong) NSObjectController *deckController;
19 @property (weak) HMKCDeck *deck;
21 @property (readonly) NSArray<NSString *> *deckObserveKeys;
23 @property (strong) NSArray<HMKCShipObject *> *ships;
24 @property (readonly) NSArray<NSString *> *shipObserveKeys;
27 @implementation HMFleet
29 + (instancetype)fleetWithNumber:(NSNumber *)fleetNumber
31 return [[self alloc] initWithNumber:fleetNumber];
33 - (instancetype)initWithNumber:(NSNumber *)fleetNumber
37 if(fleetNumber.integerValue < 1 || fleetNumber.integerValue > 4) {
40 _fleetNumber = fleetNumber;
42 _deckController = [[NSObjectController alloc] initWithContent:nil];
43 _deckController.entityName = @"Deck";
44 _deckController.managedObjectContext = [[HMServerDataStore defaultManager] managedObjectContext];
45 _deckController.fetchPredicate = [NSPredicate predicateWithFormat:@"id = %@", fleetNumber];
46 NSFetchRequest *request = [NSFetchRequest new];
47 request.entity = [NSEntityDescription entityForName:@"Deck"
48 inManagedObjectContext:[HMServerDataStore defaultManager].managedObjectContext];
49 request.predicate = _deckController.fetchPredicate;
50 [_deckController fetchWithRequest:request
54 self.deck = _deckController.content;
55 for(NSString *key in self.deckObserveKeys) {
56 [_deckController addObserver:self
59 context:(__bridge void * _Nullable)(_deck)];
67 for(NSString *key in self.deckObserveKeys) {
68 [_deckController removeObserver:self forKeyPath:key];
70 for(HMKCShipObject *ship in _ships) {
71 for(NSString *key in self.shipObserveKeys) {
72 [ship removeObserver:self forKeyPath:key];
82 - (NSArray<NSString *> *)deckObserveKeys
84 return [NSArray arrayWithObjects:
93 -(NSArray<NSString *> *)shipObserveKeys
95 return [NSArray arrayWithObjects:
103 - (HMKCShipObject *)objectAtIndexedSubscript:(NSUInteger)idx
105 return self.deck[idx];
108 - (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSString *,id> *)change context:(void *)context
110 id obj = (__bridge id)(context);
113 for(HMKCShipObject *ship in _ships) {
114 for(NSString *key in self.shipObserveKeys) {
115 [ship removeObserver:self forKeyPath:key];
119 NSMutableArray<HMKCShipObject *> *result = [NSMutableArray array];
121 for(NSUInteger i = 0; i < 6; i++) {
122 HMKCShipObject *ship = self[i];
124 [result addObject:ship];
130 for(HMKCShipObject *ship in _ships) {
131 for(NSString *key in self.shipObserveKeys) {
132 [ship addObserver:self
135 context:(__bridge void * _Nullable)(_ships)];
143 if([keyPath isEqualToString:@"sakuteki_0"]) {
144 [self willChangeValueForKey:@"totalSakuteki"];
145 [self didChangeValueForKey:@"totalSakuteki"];
147 if([keyPath isEqualToString:@"seiku"]) {
148 [self willChangeValueForKey:@"totalSeiku"];
149 [self didChangeValueForKey:@"totalSeiku"];
151 [self willChangeValueForKey:@"totalCalclatedSeiku"];
152 [self didChangeValueForKey:@"totalCalclatedSeiku"];
154 if([keyPath isEqualToString:@"lv"]) {
155 [self willChangeValueForKey:@"totalLevel"];
156 [self didChangeValueForKey:@"totalLevel"];
158 if([keyPath isEqualToString:@"totalDrums"]) {
159 [self willChangeValueForKey:@"totalDrums"];
160 [self didChangeValueForKey:@"totalDrums"];
166 [super observeValueForKeyPath:keyPath ofObject:object change:change context:context];
169 + (NSSet *)keyPathsForValuesAffectingFlagShip
171 return [NSSet setWithObject:@"deck.ship_0"];
173 - (HMKCShipObject *)flagShip
177 + (NSSet *)keyPathsForValuesAffectingSecondShip
179 return [NSSet setWithObject:@"deck.ship_1"];
181 - (HMKCShipObject *)secondShip
185 + (NSSet *)keyPathsForValuesAffectingThirdShip
187 return [NSSet setWithObject:@"deck.ship_2"];
189 - (HMKCShipObject *)thirdShip
193 + (NSSet *)keyPathsForValuesAffectingFourthShip
195 return [NSSet setWithObject:@"deck.ship_3"];
197 - (HMKCShipObject *)fourthShip
201 + (NSSet *)keyPathsForValuesAffectingFifthShip
203 return [NSSet setWithObject:@"deck.ship_4"];
205 - (HMKCShipObject *)fifthShip
209 + (NSSet *)keyPathsForValuesAffectingSixthShip
211 return [NSSet setWithObject:@"deck.ship_5"];
213 - (HMKCShipObject *)sixthShip
218 + (NSSet *)keyPathsForValuesAffectingName
220 return [NSSet setWithObject:@"deck.name"];
224 NSString *name = self.deck.name;
229 + (NSSet *)keyPathsForValuesAffectingId
231 return [NSSet setWithObject:@"deck.id"];
238 - (NSNumber *)totalSakuteki
241 for(NSInteger i = 0; i < 6; i++) {
242 HMKCShipObject *ship = self[i];
243 total += ship.sakuteki_0.integerValue;
248 - (NSNumber *)totalSeiku
251 for(NSInteger i = 0; i < 6; i++) {
252 HMKCShipObject *ship = self[i];
253 total += ship.seiku.integerValue;
258 - (NSNumber *)totalCalclatedSeiku
261 for(NSInteger i = 0; i < 6; i++) {
262 HMKCShipObject *ship = self[i];
263 total += ship.seiku.integerValue;
264 total += ship.extraSeiku.integerValue;
269 - (NSNumber *)totalLevel
272 for(NSInteger i = 0; i < 6; i++) {
273 HMKCShipObject *ship = self[i];
274 total += ship.lv.integerValue;
279 - (NSNumber *)totalDrums
282 for(NSInteger i = 0; i < 6; i++) {
283 HMKCShipObject *ship = self[i];
284 total += ship.totalDrums.integerValue;