2012-10-31 26 views
7

Tôi đang sử dụng RestKit để phân tích cú pháp JSON và ánh xạ nó vào trong NSManagedObjects dữ liệu lõi. Đây là JSON mẫu.RestKit Bản đồ động Tên mối quan hệ dựa trên Giá trị

{ 
    "events": [ 
     { 
      "description": "...", 
      "subject_type": "photo", 
      "subject": { 
       "id": 1, 
       "thumb_url": "...", 
       "medium_url": "...", 
       "large_url": "..." 
      } 
     }, 
     { 
      "description": "...", 
      "subject_type": "user", 
      "subject": { 
       "id": 1, 
       "username": "...", 
       "followers": "..." 
      } 
     } 
    ] 
} 

Sử dụng RKObjectMappingProviderRKManagedObjectMapping Tôi đang lập bản đồ các mảng "events" vào riêng biệt Core Data Event đối tượng. Điều này hoạt động tốt.

Bây giờ Event có hai mối quan hệ trên đó UserPhoto. Bây giờ tôi cần ánh xạ mảng chủ đề cho đối tượng Dữ liệu cốt lõi phù hợp dựa trên giá trị "subject_type" và đặt nó thành mối quan hệ chính xác trên Event.

Tôi đã thử sử dụng RKDynamicObjectMapping nhưng tôi không biết cách chỉ định điều đó cho "mối quan hệ động". Tôi cần một số cách để đặt tên của mối quan hệ đích dựa trên giá trị của subject_type.

Mọi suy nghĩ?

+0

Tôi muốn một người nào đó đã trả lời câu hỏi thực tế ở đây. – magma

Trả lời

1

Trong RestKit, RKDynamicMapping cũng cho phép sử dụng một khối quy định để làm các hoạt động lập bản đồ năng động phức tạp hơn như một trong đó bạn mô tả . Phương pháp cụ thể cho khả năng này được gọi là setObjectMappingForRepresentationBlock

Dưới đây là một số tài liệu về phương pháp đó: http://restkit.org/api/latest/Classes/RKDynamicMapping.html#//api/name/setObjectMappingForRepresentationBlock:

kiểm tra đơn vị

các RestKit minh họa một số trường hợp đơn giản cho phương pháp này.

0

Dường như bạn có thể sử dụng RKDynamicObjectMapping (xem Object Mapping). Bạn có thể tạo một ánh xạ người dùng và một bản đồ hình ảnh và sau đó sử dụng RKDynamicObjectMapping của bạn như thế này:

[dynamicMapping setObjectMapping:userMapping 
       whenValueOfKeyPath:@"subject_type" 
         isEqualTo:@"user"]; 
[dynamicMapping setObjectMapping:photoMapping 
       whenValueOfKeyPath:@"subject_type" 
         isEqualTo:@"photo"]; 
+0

Bây giờ, làm thế nào để thiết lập điều này trên thực thể 'Event' để nó sử dụng mối quan hệ thích hợp? – brynbodayle

0

Gần đây, tôi đã gặp sự cố này. Truy tìm thông qua RestKit, có vẻ như nó đang cố gắng áp dụng tất cả ánh xạ đối tượng cho tất cả các mối quan hệ trong một cá thể RKDynamicMapping. Xem applyRelationshipMappings trong RKMappingOperation.m

Tôi đã đưa ra giải pháp là hack, nhưng không yêu cầu tôi phải sửa đổi mã bộ nhớ.

Trong RKMappingOperation.m, tôi sửa đổi phương pháp sau:

destinationObjectForMappingRepresentation:parentRepresentation:withMapping:inRelationship: 

tôi đã thêm đoạn mã sau (bắt đầu với lời nhận xét) để kiểm tra xem đích của mối quan hệ là cùng một loại đối tượng như đang được được áp dụng và chỉ tiến hành nếu nó khớp. (Điều này đã không trải qua thử nghiệm nghiêm ngặt, nhưng đang làm việc trong trường hợp sử dụng cụ thể của tôi.)

- (id)destinationObjectForMappingRepresentation:(id)representation parentRepresentation:(id)parentRepresentation withMapping:(RKMapping *)mapping inRelationship:(RKRelationshipMapping *)relationshipMapping 
{ 
    RKObjectMapping *concreteMapping = nil; 
    if ([mapping isKindOfClass:[RKDynamicMapping class]]) { 
     concreteMapping = [(RKDynamicMapping *)mapping objectMappingForRepresentation:representation]; 
     if (! concreteMapping) { 
      RKLogDebug(@"Unable to determine concrete object mapping from dynamic mapping %@ with which to map object representation: %@", mapping, representation); 
      return nil; 
     } 
     // Make sure the destination of a core data relationship is the right entity class for the object we're mapping; 
     if ([self.destinationObject respondsToSelector:@selector(managedObjectContext)]) 
     { 
      NSEntityDescription *destinationEntity = [self.destinationObject entity]; 
      NSDictionary *destinationPropertiesDictionary = [destinationEntity propertiesByName]; 
      NSRelationshipDescription *destinationPropertyForDestinationKeyPath = [destinationPropertiesDictionary valueForKey:relationshipMapping.destinationKeyPath]; 
      NSString *relationshipDestinationClassName = [[destinationPropertyForDestinationKeyPath destinationEntity] name]; 
      NSString *mappedObjectClassName = [NSString stringWithCString:class_getName(concreteMapping.objectClass) encoding:NSUTF8StringEncoding]; 
      if (![relationshipDestinationClassName isEqualToString:mappedObjectClassName]) 
      { 
       return nil; 
      } 
     } 

...

Các vấn đề liên quan