2013-11-13 2 views
10

안녕하세요 저는 RestKit을 0.10.2에서 0.20.3으로 업데이트했습니다. 웹 서비스에서 개체가 누락되면 지금 업데이트 한 후 RestKit이 로컬 저장소에서 해당 개체를 삭제하지 않습니다. RestKit 0.20.x에서 지원된다는 것을 알고 있지만 구성 할 수 없습니다. 나는 여기서 주어진 예를 따랐다. http://restkit.org/api/latest/Classes/RKManagedObjectRequestOperation.html#overviewRestKit 로컬 저장소에서 고아 개체 삭제 안 함

나는 또한 Stackoverflow에 대한 비슷한 질문을했다. 그러나 아직 받아 들여지지 않은 대답은 없습니다.

여기 내 JSON 특정 사용자에 대한 모든 가족 구성원을 반환

{ 
    "status": "Success", 
    "member_info": [ 
     { 
      "family_id": "1", 
      "user_id": "1" 
     }, 
     { 
      "family_id": "2", 
      "user_id": "1" 
     }, 
     { 
      "family_id": "3", 
      "user_id": "1" 
     } 
    ] 
} 

입니다. Json 위는 user_id = 1입니다. 이제 요청이 user_id = 2으로 전송되면 이전의 3 개 객체가 모두 Json에서 누락되어 로컬 저장소에서 삭제되어야합니다. 다음은 새로운 Json입니다. user_id = 2

{ 
    "status": "Success", 
    "member_info": [ 
     { 
      "family_id": "4", 
      "user_id": "2" 
     }, 
     { 
      "family_id": "5", 
      "user_id": "2" 
     }   
    ] 
} 

이것은 매핑을 만드는 방법입니다. 술어에서

[objectManager addResponseDescriptorsFromArray:@[                             
                [RKResponseDescriptor responseDescriptorWithMapping:[self connectionsMapping] 
                            method:RKRequestMethodPOST 
                          pathPattern:@"familylist" 
                           keyPath:@"member_info" statusCodes:RKStatusCodeIndexSetForClass(RKStatusCodeClassSuccessful)]]; 



[objectManager addFetchRequestBlock:^NSFetchRequest *(NSURL *URL) { 
     RKPathMatcher *pathMatcher = [RKPathMatcher pathMatcherWithPattern:@"familylist"]; 
     NSDictionary *argsDict = nil; 
     BOOL match = [pathMatcher matchesPath:[URL relativePath] tokenizeQueryStrings:NO parsedArguments:&argsDict]; 
     if (match) { 
      NSFetchRequest *fetchRequest = [NSFetchRequest fetchRequestWithEntityName:@"DBConnections"]; 
      NSPredicate *predicate = [NSPredicate predicateWithFormat:@"user_id == %@", [DBUser currentUser].user_id]; 
      fetchRequest.predicate = predicate; 
      fetchRequest.sortDescriptors = @[ [NSSortDescriptor sortDescriptorWithKey:@"first_name" ascending:YES] ]; 
      return fetchRequest; 
     } 

     return nil; 
    }]; 


- (RKEntityMapping *)connectionsMapping { 
    RKEntityMapping *connectionsMapping = [RKEntityMapping mappingForEntityForName:@"DBConnections" inManagedObjectStore:objectManager.managedObjectStore]; 
    connectionsMapping.setDefaultValueForMissingAttributes = NO; 
    connectionsMapping.identificationAttributes = @[@"family_id"]; 
    [connectionsMapping addAttributeMappingsFromDictionary:@{ 
                  @"family_id": @"family_id", 
                  @"user_id": @"user_id", 
                  }]; 

    return connectionsMapping; 
} 

은 내가 user_id 현재 로그인을 반환하는 [DBUser currentUser].user_id을 사용하고 있습니다. 그리고 여기에 서버가 POST 요청 방법을 기대하고 있기 때문에, 내가 대신 getObjectsAtPathpostObject을 사용하고있는 웹 서비스

[[RKObjectManager sharedManager] postObject:nil path:@"familylist" parameters:params 
              success:^(RKObjectRequestOperation *operation, RKMappingResult *mappingResult) { 
NSLog(@"Objects are %@", mappingResult.array); 
}]; 

를 호출하고 있습니다. 내가 잘못하고 있니? 또는 고아 오브젝트를 삭제하기 위해 다른 작업을 수행해야합니다. 어떤 도움을 주셔서 감사합니다.

+1

'[DBUser currentUser] .user_id' 값을 디버깅 했습니까? 술어는 꼭 필요한 것은 아니며, 술어없이 시도 했습니까? – Wain

+0

감사합니다 @Wain, 나는 당신을 찾고 있었다 :), 나는 술어에 대한 값을 디버깅했는데 괜찮 았어, 내가 술어없이 시도하자. – Khawar

+0

술어가 없어도 이전 데이터는 삭제되지 않습니다. – Khawar

답변

11

마지막 단계에서 RestKit 단계를 디버깅하여 문제를 해결하고 RKManagedObjectRequestOperation.m

if (! [[self.HTTPRequestOperation.request.HTTPMethod uppercaseString] isEqualToString:@"GET"]) { 
     RKLogDebug(@"Skipping deletion of orphaned objects: only performed for GET requests."); 
     return YES; 
    } 

아에이 코드를 발견! RestKit은 요청 메소드가 POST 일 때 고아 오브젝트를 h 제하지 않습니다. 웹 서비스를 변경하여 GET 요청을 받아 들였습니다. 완벽하게 작동했습니다. 둘째 나는 그것이 현재 사용자를 제외한 모든 개체를 삭제하는 잘못 predicate

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"user_id == %@", [DBUser currentUser].user_id]; 

을 사용했다, 그래서 predicate 당신이 원하는 것을 의미하지 않는다이

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"user_id != %@", [DBUser currentUser].user_id]; 

처럼 NOT 연산자를 추가했다 , 그러나 그것은 당신이 원하지 않는 것입니다.

+0

3 년 후에 그냥 코멘트를 추가해도 되겠습니까 ... 술어는 "제거하려는 대상"또는 "원하는 대상"을 의미하지 않습니다. "요청에서 모든 오브젝트 예상"을 의미하고, 그 다음 모두 결과의 오브젝트는 해당 세트에서 제외됩니다. – netigger