Enable the response mapper to read the objectID from the targetObject if the target object ID is nil.

This commit is contained in:
Blake Watters
2012-09-30 17:13:51 -04:00
parent 27dd271938
commit 8c34f0996b
2 changed files with 12 additions and 4 deletions

View File

@@ -180,6 +180,8 @@
/**
The permanent `NSManagedObjectID` for the target object of the mapping operation. During mapping, an instance local to the `managedObjectContext` is fetched and used to perform the mapping operation.
If `nil` and the `targetObject` is a managed object, the `objectID` of the target object will be used.
*/
@property (nonatomic, copy) NSManagedObjectID *targetObjectID;

View File

@@ -231,6 +231,11 @@ NSError *RKErrorFromMappingResult(RKMappingResult *mappingResult)
@end
static inline NSManagedObjectID *RKObjectIDFromObjectIfManaged(id object)
{
return [object isKindOfClass:[NSManagedObject class]] ? [object objectID] : nil;
}
@implementation RKManagedObjectResponseMapperOperation
- (RKMappingResult *)performMappingWithObject:(id)sourceObject error:(NSError **)error
@@ -249,11 +254,12 @@ NSError *RKErrorFromMappingResult(RKMappingResult *mappingResult)
if (NSLocationInRange(self.response.statusCode, RKStatusCodeRangeForClass(RKStatusCodeClassSuccessful))) {
mapper.targetObject = self.targetObject;
if (self.targetObjectID) {
if ([self.targetObjectID isTemporaryID]) RKLogWarning(@"Performing object mapping to temporary target objectID. Results may not be accessible without obtaining a permanent object ID.");
NSManagedObject *localObject = [self.managedObjectContext existingObjectWithID:self.targetObjectID error:&blockError];
NSManagedObjectID *objectID = self.targetObjectID ?: RKObjectIDFromObjectIfManaged(self.targetObject);
if (objectID) {
if ([objectID isTemporaryID]) RKLogWarning(@"Performing object mapping to temporary target objectID. Results may not be accessible without obtaining a permanent object ID.");
NSManagedObject *localObject = [self.managedObjectContext existingObjectWithID:objectID error:&blockError];
if (! localObject) {
RKLogWarning(@"Failed to retrieve existing object with ID: %@", self.targetObjectID);
RKLogWarning(@"Failed to retrieve existing object with ID: %@", objectID);
RKLogCoreDataError(blockError);
}
mapper.targetObject = localObject;