2014-03-27 2 views
2

내 응용 프로그램에 RestKit 0.20.3을 사용하고 있습니다. 오프라인 모드이므로 개체를 로컬 coredata에 저장해야합니다.개체의 RestKit 로컬 삭제가 여전히 매핑에 나타납니다.

서버에서 일부 개체가 삭제 될 때마다 deletionPredicate으로 매핑 할 때 JSON에 deleted = true 특성이 전송됩니다. 내 매핑은 다음과 같습니다.

- (RKEntityMapping *)meetingsMapping { 

    RKEntityMapping *meetingsMapping = [RKEntityMapping mappingForEntityForName:@"DBMeetings" inManagedObjectStore:objectManager.managedObjectStore]; 
    meetingsMapping.setDefaultValueForMissingAttributes = NO; 
    meetingsMapping.deletionPredicate = [NSPredicate predicateWithFormat:@"shouldBeDeleted = 1"]; 
    [meetingsMapping setModificationAttributeForName:@"updated_at"]; 
    meetingsMapping.identificationAttributes = @[@"id"]; 

    [meetingsMapping addAttributeMappingsFromDictionary:@{ 
                 @"id": @"id", 
                 @"title": @"title", 

                 @"start_date_human": @"start_date_human", 
                 @"start_time_human": @"start_time_human", 
                 @"finish_date_human": @"finish_date_human", 
                 @"finish_time_human": @"finish_time_human", 

                 @"lock": @"lock", 
                 @"location": @"location", 
                 @"sample": @"sample", 

                 @"deleted": @"shouldBeDeleted", 

                 @"created_at": @"created_at", 
                 @"updated_at": @"updated_at", 
                 @"follow_up_id": @"follow_up_id", 
                 @"total_topics": @"total_topics", 
                 }]; 

[meetingsMapping addRelationshipMappingWithSourceKeyPath:@"tags" mapping:[self tagsMapping]]; 
[meetingsMapping addRelationshipMappingWithSourceKeyPath:@"required_participants" mapping:[self contactsMapping]]; 
[meetingsMapping addRelationshipMappingWithSourceKeyPath:@"optional_participants" mapping:[self contactsMapping]]; 
[meetingsMapping addRelationshipMappingWithSourceKeyPath:@"readonly_participants" mapping:[self contactsMapping]]; 
[meetingsMapping addRelationshipMappingWithSourceKeyPath:@"organizer" mapping:[self contactsMapping]]; 

return meetingsMapping; 

}

그것은 잘 작동하고, 속성은 지역 CoreData에서 제거됩니다.

문제는 getObjectsAtPath 메서드는 모든 개체를 mappingResult 매개 변수로 반환합니다. 5 20 중 객체가 삭제 된 경우

[[RKObjectManager sharedManager] getObjectsAtPath:[NSString stringWithFormat:@"%@?type=past&page=%i", URL_MEETINGS, pageNo] 
             parameters:nil 
              success:^(RKObjectRequestOperation *operation, RKMappingResult *mappingResult) { 
               KLog(@"%@", mappingResult.array); // It is returning all objects, not only non-deleted objects 
               completionHandler(mappingResult.array, nil); 
              } 
              failure:^(RKObjectRequestOperation *operation, NSError *error) { 
               completionHandler(nil, error); 
              }]; 

는 가정, mappingResult.array 20 개 기록하지 (15) 5 개 삭제 된 레코드에 데이터가 없습니다를 반환합니다. 내가 mappingResult.array를 로그인 할 때, 처음 5 개 레코드는 다음과 같은 인쇄 : 제가 DB에 체크하면, 15 기록

2014-03-27 13:10:14.105 MeetingKing[7851:70b] W restkit.network.core_data:RKManagedObjectRequestOperation.m:125 Unable to refetch managed object <DBMeetings: 0xc1cb820> (entity: DBMeetings; id: 0xc1a6a60 <x-coredata://7B9FC7F6-C0E9-4DF5-91AC-D7C49F54B4F5/DBMeetings/t2915CF2E-2D7D-4E29-8B39-B1C51151809410> ; data: <fault>): the object has a temporary managed object ID. 
2014-03-27 13:10:14.105 MeetingKing[7851:70b] W restkit.network.core_data:RKManagedObjectRequestOperation.m:125 Unable to refetch managed object <DBMeetings: 0xc5b2ed0> (entity: DBMeetings; id: 0xc5d1110 <x-coredata://7B9FC7F6-C0E9-4DF5-91AC-D7C49F54B4F5/DBMeetings/t2915CF2E-2D7D-4E29-8B39-B1C51151809416> ; data: <fault>): the object has a temporary managed object ID. 
2014-03-27 13:10:14.106 MeetingKing[7851:70b] W restkit.network.core_data:RKManagedObjectRequestOperation.m:125 Unable to refetch managed object <DBMeetings: 0xc58b6a0> (entity: DBMeetings; id: 0xc5d3de0 <x-coredata://7B9FC7F6-C0E9-4DF5-91AC-D7C49F54B4F5/DBMeetings/t2915CF2E-2D7D-4E29-8B39-B1C51151809417> ; data: <fault>): the object has a temporary managed object ID. 
2014-03-27 13:10:14.106 MeetingKing[7851:70b] W restkit.network.core_data:RKManagedObjectRequestOperation.m:125 Unable to refetch managed object <DBMeetings: 0xc5b50e0> (entity: DBMeetings; id: 0xc5d4af0 <x-coredata://7B9FC7F6-C0E9-4DF5-91AC-D7C49F54B4F5/DBMeetings/t2915CF2E-2D7D-4E29-8B39-B1C51151809419> ; data: <fault>): the object has a temporary managed object ID. 
2014-03-27 13:10:14.107 MeetingKing[7851:70b] W restkit.network.core_data:RKManagedObjectRequestOperation.m:125 Unable to refetch managed object <DBMeetings: 0xc1ed5a0> (entity: DBMeetings; id: 0xc1c84e0 <x-coredata://7B9FC7F6-C0E9-4DF5-91AC-D7C49F54B4F5/DBMeetings/t2915CF2E-2D7D-4E29-8B39-B1C51151809422> ; data: <fault>): the object has a temporary managed object ID. 

있다. 괜찮아.

내가 명시 적으로 DB에서 가져 오는 경우

, 그것은 mappingResult.array 매개 변수는 20 개 레코드를 반환, 즉

그러나 getObjectsAtPath 콜백에서

괜찮아요, 15 개 레코드를 반환합니다. 그건 좋지 않아. 5 행 데이터가없는과 :(

문제는, mappingResult.arraycount 20 내 UITableView 표시 20 행을하게됩니다.

정확하게 15 개 레코드를 반환 RestKit하여 다른 콜백은 내가 않을 것 있나요

답변

2

mappingResult은 매핑 된 객체를 반환합니다. 실제로 삭제 된 항목은 변경되지 않습니다. 실제로 모든 항목이 삭제됩니다. 매핑 된 모든 개체와 결과적으로 삭제 된 개체를 알 때 필요한 정보입니다.

간단한 해결책은 NSFetchedResultsController을 사용하여 테이블보기의 데이터를 가져 오는 것입니다. 업데이트, 삽입 및 삭제를 올바르게 처리 할 것이므로 추가 작업을 수행 할 필요가 없습니다.

또는 mappingResult.array을 반복하고 삭제 된 항목을 필터링해야합니다. 확인하는 가장 좋은 방법은 수표를 사용하는 것입니다.

if (item.isDeleted || item.managedObjectContext == nil) { 
    // remove the now invalid item... 
} 
+0

감사합니다. @wain, MagicalRecords를 사용하고 있으며 DB에서 다시 가져 오는 데 사용합니다. 올바른 기록을 반환 중입니다. 나는 이것을 달성 할 다른 방법이 있을지 궁금해하고있었습니다. – Khawar