@@ -526,6 +526,7 @@ - (BOOL)canSkipMapping
526
526
BOOL (^shouldSkipMapping)(void ) = ^{
527
527
// Is the request cacheable
528
528
if (!self.cachedResponse ) return NO ;
529
+ if (!self.managedObjectCache ) return NO ;
529
530
NSURLRequest *request = self.HTTPRequestOperation .request ;
530
531
if (! [[request HTTPMethod ] isEqualToString: @" GET" ] && ! [[request HTTPMethod ] isEqualToString: @" HEAD" ]) return NO ;
531
532
NSHTTPURLResponse *response = (NSHTTPURLResponse *)self.HTTPRequestOperation .response ;
@@ -666,7 +667,7 @@ - (BOOL)deleteTargetObjectIfAppropriate:(NSError **)error
666
667
return _blockSuccess;
667
668
}
668
669
669
- - (NSSet *)localObjectsFromFetchRequestsMatchingRequestURL : (NSError **)error
670
+ - (NSSet *)localObjectsFromFetchRequests : ( NSArray *) fetchRequests matchingRequestURL : (NSError **)error
670
671
{
671
672
NSMutableSet *localObjects = [NSMutableSet set ];
672
673
__block NSError *_blockError;
@@ -699,6 +700,23 @@ - (NSSet *)localObjectsFromFetchRequestsMatchingRequestURL:(NSError **)error
699
700
return localObjects;
700
701
}
701
702
703
+ - (NSArray *)fetchRequestsMatchingResponseURL
704
+ {
705
+ // Pass the fetch request blocks a relative `NSURL` object if possible
706
+ NSMutableArray *fetchRequests = [NSMutableArray array ];
707
+ NSURL *URL = RKRelativeURLFromURLAndResponseDescriptors (self.HTTPRequestOperation .response .URL , self.responseDescriptors );
708
+ for (RKFetchRequestBlock fetchRequestBlock in [self .fetchRequestBlocks reverseObjectEnumerator ]) {
709
+ NSFetchRequest *fetchRequest = fetchRequestBlock (URL);
710
+ if (fetchRequest) {
711
+ // Workaround for iOS 5 -- The log statement crashes if the entity is not assigned before logging
712
+ [fetchRequest setEntity: [[[[self .privateContext persistentStoreCoordinator ] managedObjectModel ] entitiesByName ] objectForKey: [fetchRequest entityName ]]];
713
+ RKLogDebug (@" Found fetch request matching URL '%@ ': %@ " , URL, fetchRequest);
714
+ [fetchRequests addObject: fetchRequest];
715
+ }
716
+ }
717
+ return fetchRequests;
718
+ }
719
+
702
720
- (BOOL )deleteLocalObjectsMissingFromMappingResult : (RKMappingResult *)mappingResult error : (NSError **)error
703
721
{
704
722
if (! self.deletesOrphanedObjects ) {
@@ -716,8 +734,13 @@ - (BOOL)deleteLocalObjectsMissingFromMappingResult:(RKMappingResult *)mappingRes
716
734
return YES ;
717
735
}
718
736
737
+ // Determine if there are any fetch request blocks to use for orphaned object cleanup
738
+ NSArray *fetchRequests = [self fetchRequestsMatchingResponseURL ];
739
+ if (! [fetchRequests count ]) return YES ;
740
+
741
+ // Proceed with cleanup
719
742
NSSet *managedObjectsInMappingResult = RKManagedObjectsFromMappingResultWithMappingInfo (mappingResult, self.mappingInfo ) ?: [NSSet set ];
720
- NSSet *localObjects = [self localObjectsFromFetchRequestsMatchingRequestURL : error];
743
+ NSSet *localObjects = [self localObjectsFromFetchRequests: fetchRequests matchingRequestURL : error];
721
744
if (! localObjects) {
722
745
RKLogError (@" Failed when attempting to fetch local candidate objects for orphan cleanup: %@ " , error ? *error : nil );
723
746
return NO ;
0 commit comments