Skip to content

Commit

Permalink
Fixed problems with initial implementation of temporary managed objec…
Browse files Browse the repository at this point in the history
…ts visitor. The implementation was under tested and only worked with a single relationship. refs #1001
  • Loading branch information
blakewatters committed Jan 11, 2013
1 parent 51d36fb commit 3e42570
Show file tree
Hide file tree
Showing 4 changed files with 17 additions and 11 deletions.
20 changes: 13 additions & 7 deletions Code/Network/RKObjectManager.m
Original file line number Diff line number Diff line change
Expand Up @@ -281,7 +281,7 @@ - (id)initWithManagedObject:(NSManagedObject *)managedObject;

@interface RKTemporaryManagedObjectVisitor ()
@property (nonatomic, strong) NSMutableSet *mutableTemporaryObjects;
@property (nonatomic, strong) NSMutableSet *mutableVisitedObjects;
@property (nonatomic, strong) NSMutableDictionary *mutableVisitedObjectsToRelationships;
@end

@implementation RKTemporaryManagedObjectVisitor
Expand All @@ -296,9 +296,9 @@ - (id)initWithManagedObject:(NSManagedObject *)managedObject
{
self = [super init];
if (self) {
self.mutableVisitedObjects = [NSMutableSet set];
self.mutableVisitedObjectsToRelationships = [NSMutableDictionary new];
self.mutableTemporaryObjects = [NSMutableSet set];

if ([managedObject.objectID isTemporaryID]) [self.mutableTemporaryObjects addObject:managedObject];
[[managedObject.entity relationshipsByName] enumerateKeysAndObjectsUsingBlock:^(NSString *relationshipName, NSRelationshipDescription *relationship, BOOL *stop) {
[self visitObjectsAtRelationship:relationship ofObject:managedObject];
Expand All @@ -309,12 +309,18 @@ - (id)initWithManagedObject:(NSManagedObject *)managedObject

- (void)visitObjectsAtRelationship:(NSRelationshipDescription *)relationship ofObject:(NSManagedObject *)managedObject
{
if ([self.mutableVisitedObjects containsObject:managedObject]) return;
[self.mutableVisitedObjects addObject:managedObject];

NSValue *dictionaryKey = [NSValue valueWithNonretainedObject:managedObject];
NSMutableSet *visitedRelationships = [self.mutableVisitedObjectsToRelationships objectForKey:dictionaryKey];
if (!visitedRelationships) {
visitedRelationships = [NSMutableSet set];
[self.mutableVisitedObjectsToRelationships setObject:visitedRelationships forKey:dictionaryKey];
}
if ([visitedRelationships containsObject:relationship]) return;
[visitedRelationships addObject:relationship];

id relatedObjectOrObjects = [managedObject valueForKey:relationship.name];
if (relatedObjectOrObjects && ![relationship isToMany]) relatedObjectOrObjects = @[ relatedObjectOrObjects ];

for (NSManagedObject *relatedObject in relatedObjectOrObjects) {
if ([[relatedObject objectID] isTemporaryID]) [self.mutableTemporaryObjects addObject:relatedObject];
[[relatedObject.entity relationshipsByName] enumerateKeysAndObjectsUsingBlock:^(NSString *relationshipName, NSRelationshipDescription *relationship, BOOL *stop) {
Expand Down
8 changes: 4 additions & 4 deletions Tests/Logic/ObjectMapping/RKObjectManagerTest.m
Original file line number Diff line number Diff line change
Expand Up @@ -965,16 +965,16 @@ - (void)testThatPostingUnsavedObjectWithUnsavedChildrenDoesNotCrash
expect([restkitTag.objectID isTemporaryID]).to.equal(YES);

__block RKMappingResult *postMappingResult = nil;
[objectManager postObject:post path:@"/posts.json" parameters:nil success:^(RKObjectRequestOperation *operation, RKMappingResult *mappingResult) {
RKManagedObjectRequestOperation *operation = [objectManager appropriateObjectRequestOperationWithObject:post method:RKRequestMethodPOST path:@"/posts.json" parameters:nil];
operation.savesToPersistentStore = NO;
[operation setCompletionBlockWithSuccess:^(RKObjectRequestOperation *operation, RKMappingResult *mappingResult) {
postMappingResult = mappingResult;
} failure:nil];
[objectManager enqueueObjectRequestOperation:operation];

expect(postMappingResult).willNot.beNil();
expect([post isNew]).will.equal(NO);
expect([post.objectID isTemporaryID]).will.equal(NO);
expect([developmentTag isNew]).will.equal(NO);
expect([developmentTag.objectID isTemporaryID]).will.equal(NO);
expect([restkitTag isNew]).will.equal(NO);
expect([restkitTag.objectID isTemporaryID]).will.equal(NO);
}

Expand Down
Binary file modified Tests/Models/Data Model.xcdatamodel/elements
Binary file not shown.
Binary file modified Tests/Models/Data Model.xcdatamodel/layout
Binary file not shown.

0 comments on commit 3e42570

Please sign in to comment.