Skip to content

Commit a971c39

Browse files
committed
Fixed issues in previous code.
See Issue #75, comment by @batkuip "Those methods are trickier to implement because the mutable set accessor uses mutableSetValueForKey which seems to call the insertObject:atIndex internally causing it loop forever." This code creates a temporary mutable set using the ordered set (not the mutable set which loops as noted), making sure to call appropriate KVC methods. Credit for original code/idea goes to @dmitry Makarenkoless and @jlust on StackOverFlow (http://stackoverflow.com/questions/7385439/exception-thrown-in-nsorderedset-generated-accessors).
1 parent 13a3630 commit a971c39

File tree

2 files changed

+36
-12
lines changed

2 files changed

+36
-12
lines changed

templates/machine.h.motemplate

+2-5
Original file line numberDiff line numberDiff line change
@@ -122,19 +122,16 @@ extern const struct <$managedObjectClassName$>UserInfo {<$foreach UserInfo userI
122122
- (void)remove<$Relationship.name.initialCapitalString$>:(<$Relationship.immutableCollectionClassName$>*)value_;
123123
- (void)add<$Relationship.name.initialCapitalString$>Object:(<$Relationship.destinationEntity.managedObjectClassName$>*)value_;
124124
- (void)remove<$Relationship.name.initialCapitalString$>Object:(<$Relationship.destinationEntity.managedObjectClassName$>*)value_;
125-
126125
<$if Relationship.isOrdered$>
127-
- (void)insertObject:(<$Relationship.immutableCollectionClassName$>*)value in<$Relationship.name.initialCapitalString$>AtIndex:(NSUInteger)idx;
126+
- (void)insertObject:(<$Relationship.destinationEntity.managedObjectClassName$>*)value in<$Relationship.name.initialCapitalString$>AtIndex:(NSUInteger)idx;
128127
- (void)removeObjectFrom<$Relationship.name.initialCapitalString$>AtIndex:(NSUInteger)idx;
129128
- (void)insert<$Relationship.name.initialCapitalString$>:(NSArray *)value atIndexes:(NSIndexSet *)indexes;
130129
- (void)remove<$Relationship.name.initialCapitalString$>AtIndexes:(NSIndexSet *)indexes;
131-
- (void)replaceObjectIn<$Relationship.name.initialCapitalString$>AtIndex:(NSUInteger)idx withObject:(<$Relationship.immutableCollectionClassName$>*)value;
130+
- (void)replaceObjectIn<$Relationship.name.initialCapitalString$>AtIndex:(NSUInteger)idx withObject:(<$Relationship.destinationEntity.managedObjectClassName$>*)value;
132131
- (void)replace<$Relationship.name.initialCapitalString$>AtIndexes:(NSIndexSet *)indexes with<$Relationship.name.initialCapitalString$>:(NSArray *)values;
133132
<$endif$>
134-
135133
@end
136134
<$endif$>
137-
138135
<$endforeach do$>
139136

140137
@interface _<$managedObjectClassName$> (CoreDataGeneratedPrimitiveAccessors)

templates/machine.m.motemplate

+34-7
Original file line numberDiff line numberDiff line change
@@ -243,23 +243,50 @@ const struct <$managedObjectClassName$>UserInfo <$managedObjectClassName$>UserIn
243243
- (void)remove<$Relationship.name.initialCapitalString$>Object:(<$Relationship.destinationEntity.managedObjectClassName$>*)value_ {
244244
[self.<$Relationship.name$>Set removeObject:value_];
245245
}
246-
- (void)insertObject:(<$Relationship.immutableCollectionClassName$>*)value in<$Relationship.name.initialCapitalString$>AtIndex:(NSUInteger)idx {
247-
[self.<$Relationship.name$>Set insertObject:value atIndex:idx];
246+
- (void)insertObject:(<$Relationship.destinationEntity.managedObjectClassName$>*)value in<$Relationship.name.initialCapitalString$>AtIndex:(NSUInteger)idx {
247+
NSIndexSet* indexes = [NSIndexSet indexSetWithIndex:idx];
248+
[self willChange:NSKeyValueChangeInsertion valuesAtIndexes:indexes forKey:@"<$Relationship.name$>"];
249+
NSMutableOrderedSet *tmpOrderedSet = [NSMutableOrderedSet orderedSetWithOrderedSet:[self <$Relationship.name$>]];
250+
[tmpOrderedSet insertObject:value atIndex:idx];
251+
[self setPrimitiveValue:tmpOrderedSet forKey:@"<$Relationship.name$>"];
252+
[self didChange:NSKeyValueChangeInsertion valuesAtIndexes:indexes forKey:@"<$Relationship.name$>"];
248253
}
249254
- (void)removeObjectFrom<$Relationship.name.initialCapitalString$>AtIndex:(NSUInteger)idx {
250-
[self.<$Relationship.name$>Set removeObjectAtIndex:idx];
255+
NSIndexSet* indexes = [NSIndexSet indexSetWithIndex:idx];
256+
[self willChange:NSKeyValueChangeRemoval valuesAtIndexes:indexes forKey:@"<$Relationship.name$>"];
257+
NSMutableOrderedSet *tmpOrderedSet = [NSMutableOrderedSet orderedSetWithOrderedSet:[self <$Relationship.name$>]];
258+
[tmpOrderedSet removeObjectAtIndex:idx];
259+
[self setPrimitiveValue:tmpOrderedSet forKey:@"<$Relationship.name$>"];
260+
[self didChange:NSKeyValueChangeRemoval valuesAtIndexes:indexes forKey:@"<$Relationship.name$>"];
251261
}
252262
- (void)insert<$Relationship.name.initialCapitalString$>:(NSArray *)value atIndexes:(NSIndexSet *)indexes {
253-
[self.<$Relationship.name$>Set insertObjects:value atIndexes:indexes];
263+
[self willChange:NSKeyValueChangeInsertion valuesAtIndexes:indexes forKey:@"<$Relationship.name$>"];
264+
NSMutableOrderedSet *tmpOrderedSet = [NSMutableOrderedSet orderedSetWithOrderedSet:[self <$Relationship.name$>]];
265+
[tmpOrderedSet insertObjects:value atIndexes:indexes];
266+
[self setPrimitiveValue:tmpOrderedSet forKey:@"<$Relationship.name$>"];
267+
[self didChange:NSKeyValueChangeInsertion valuesAtIndexes:indexes forKey:@"<$Relationship.name$>"];
254268
}
255269
- (void)remove<$Relationship.name.initialCapitalString$>AtIndexes:(NSIndexSet *)indexes {
256-
[self.<$Relationship.name$>Set removeObjectsAtIndexes:indexes];
270+
[self willChange:NSKeyValueChangeRemoval valuesAtIndexes:indexes forKey:@"<$Relationship.name$>"];
271+
NSMutableOrderedSet *tmpOrderedSet = [NSMutableOrderedSet orderedSetWithOrderedSet:[self <$Relationship.name$>]];
272+
[tmpOrderedSet removeObjectsAtIndexes:indexes];
273+
[self setPrimitiveValue:tmpOrderedSet forKey:@"<$Relationship.name$>"];
274+
[self didChange:NSKeyValueChangeRemoval valuesAtIndexes:indexes forKey:@"<$Relationship.name$>"];
257275
}
258276
- (void)replaceObjectIn<$Relationship.name.initialCapitalString$>AtIndex:(NSUInteger)idx withObject:(<$Relationship.immutableCollectionClassName$>*)value {
259-
[self.<$Relationship.name$>Set replaceObjectAtIndex:idx withObject:value];
277+
NSIndexSet* indexes = [NSIndexSet indexSetWithIndex:idx];
278+
[self willChange:NSKeyValueChangeReplacement valuesAtIndexes:indexes forKey:@"<$Relationship.name$>"];
279+
NSMutableOrderedSet *tmpOrderedSet = [NSMutableOrderedSet orderedSetWithOrderedSet:[self <$Relationship.name$>]];
280+
[tmpOrderedSet replaceObjectAtIndex:idx withObject:value];
281+
[self setPrimitiveValue:tmpOrderedSet forKey:@"<$Relationship.name$>"];
282+
[self didChange:NSKeyValueChangeReplacement valuesAtIndexes:indexes forKey:@"<$Relationship.name$>"];
260283
}
261284
- (void)replace<$Relationship.name.initialCapitalString$>AtIndexes:(NSIndexSet *)indexes with<$Relationship.name.initialCapitalString$>:(NSArray *)value {
262-
[self.<$Relationship.name$>Set replaceObjectsAtIndexes:indexes withObjects:value];
285+
[self willChange:NSKeyValueChangeReplacement valuesAtIndexes:indexes forKey:@"<$Relationship.name$>"];
286+
NSMutableOrderedSet *tmpOrderedSet = [NSMutableOrderedSet orderedSetWithOrderedSet:[self <$Relationship.name$>]];
287+
[tmpOrderedSet replaceObjectsAtIndexes:indexes withObjects:value];
288+
[self setPrimitiveValue:tmpOrderedSet forKey:@"<$Relationship.name$>"];
289+
[self didChange:NSKeyValueChangeReplacement valuesAtIndexes:indexes forKey:@"<$Relationship.name$>"];
263290
}
264291
@end
265292
<$endif$><$endif$><$endforeach do$>

0 commit comments

Comments
 (0)