2013-07-06 3 views
0

앱의 백엔드에 RestKit을 사용하고 있습니다. 모든 것이 잘 작동하지만 로컬 삭제 후 변경되지 않은 데이터를 가져 오는 문제가 있습니다.RestKit 데이터 동기화 게시물 로컬 삭제 문제

[self.objectManager addFetchRequestBlock:^NSFetchRequest *(NSURL *URL) { 
    RKPathMatcher *pathMatcher = [RKPathMatcher pathMatcherWithPattern:@"cards"]; 
    if([pathMatcher matchesPath:[URL relativePath] tokenizeQueryStrings:NO parsedArguments:nil]) 
     return [NSFetchRequest fetchRequestWithEntityName:@"Card"]; 
    return nil; 
    }]; 

API 응답 로컬 객체 중 하나가 누락 될 때 삭제 작업 제대로 전파되어

경로 일치한다. 지역의 삭제가 같이 수행 할 때

그러나, 상기/카드 요청이 다시 수행된다 가져 오는 경우

for(NSManagedObject *entity in cards) { 
    [RKManagedObjectStore.defaultStore.mainQueueManagedObjectContext deleteObject:card]; 

단지 CoreData에서 삭제 된 개체를 변경하지 않은 경우, 카드는 업데이트되지 않습니다. 앱이 다시 실행되거나 새 객체가 API 응답에 포함될 때까지 계속됩니다. 나는이 문제를 해결하기 위해 할 수있는 아무것도

2013-07-03 17:58:00.732 Thanx[76837:c07] I restkit.network:RKHTTPRequestOperation.m:185 GET 'http://api.thanx-web.dev/v2/cards' (200 OK) [0.1086 s] 
    2013-07-03 17:58:00.734 Thanx[76837:c07] <RKMappingResult: 0xac9b080, results={ 
     "<null>" =  (
    ); 
    }> 
    2013-07-03 17:58:00.734 Thanx[76837:c07] <RKManagedObjectRequestOperation: 0xbb32250, state: Successful, isCancelled=NO, request: <NSMutableURLRequest http://api.thanx-web.dev/v2/cards>, response: <NSHTTPURLResponse: 0xbb42060 statusCode=200 MIMEType=application/json length=201>> 

있습니까 :

RKMappingResult는 서버가 적절한 JSON을 반환하는 경우에도 비어? 일종의 캐싱 문제 인 것 같습니다. 그러나 로컬 삭제 직후에 [RKManagedObjectStore.defaultStore resetPersistentStores:nil] 함수를 실행해도이 문제가 해결되지 않는 것 같습니다. - 도움을

감사합니다,

대런

편집은 여기에 해당 모델의 매핑은 다음과 같습니다

RKEntityMapping *mapping = [RKEntityMapping mappingForEntityForName:@"Card" inManagedObjectStore:self.objectManager.managedObjectStore]; 
// enable validations 
mapping.performKeyValueValidation = YES; 
// if validation fails, skip object rather than entire request 
mapping.discardsInvalidObjectsOnInsert = YES; 
// add json-to-model mappings 
[mapping addAttributeMappingsFromArray:@"card_id", @"last4", @"name"]; 

식별이 card_id에 기본값 속성 때문에 수동으로 지정되지 않았습니다.

감사합니다.

+0

매핑에 어떤 식별 속성을 지정 했습니까? 모든 매핑을 표시하십시오. – Wain

+0

@Wain - 응답 해 주셔서 감사합니다. 카드에 대한 매핑으로 질문을 업데이트했습니다. 식별 속성은 지정되지 않지만 RestKit은 기본적으로'card_id '를 사용합니다. 이것이 문제가 될까요? –

+0

@Wain - 나는 그것을 테스트하고'card_id'를 수동으로 설정했습니다. 어떤 아이디어? –

답변

0

사실 현재 생성 된 관리 컨텍스트가 아닌 persistentstore에서 데이터를 가져와야합니다. 내 말은

NSFetchRequest *fetchRequest = [NSFetchRequest fetchRequestWithEntityName:@"MyModel"]; 
NSSortDescriptor *descriptor = [NSSortDescriptor sortDescriptorWithKey:@"id" ascending:NO]; 
fetchRequest.sortDescriptors = @[descriptor]; 

// Setup fetched results 
NSFetchedResultsController *fetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest 
                     managedObjectContext:[RKManagedObjectStore defaultStore].persistentStoreManagedObjectContext 
                      sectionNameKeyPath:nil 
                        cacheName:nil]; 

// AND TO DELETE A MODEL : 

[[RKManagedObjectStore defaultStore].persistentStoreManagedObjectContext deleteObject:myobject]; 
+0

삭제에 사용 된 MOC가 관찰되고 변경 내용이 전파되므로 ID 캐시 문제 일 가능성이 더 높습니다. – Wain

+0

@Lonkly - 나는 그것이 사실이라고 믿지 않는다. 이것은 문서화 된 것에 위배됩니다. http://restkit.org/api/latest/Classes/RKManagedObjectStore.html#//api/name/mainQueueManagedObjectContext "메인 큐 컨텍스트는 메인 큐에서 사용자 인터페이스 요구를 유도하기 위해 사용할 수 있습니다. 컨텍스트는 NSMainQueueConcurrencyType이며 주 스레드에서 직접 메시지를 보낼 수 있습니다. 컨텍스트는 persistentStoreManagedObjectContext의 하위 컨텍스트이며 저장을 통해 부모까지 변경 내용을 유지할 수 있습니다. " –

+0

글쎄, 사실일지도 모르니,이 경우 @blakeewater가 시도 할 것을 권유했기 때문이다. 너 그거 해봤 니? – Lonkly