2012-10-31 22 views
7

JSON'u ayrıştırmak ve Çekirdek Veriler NSManagedObjects ile eşlemek için RestKit kullanıyorum. İşte örnek bir JSON. Ayrı Çekirdek Veri Event nesnelerin içine "events" dizisi haritalama am RKObjectMappingProvider ve RKManagedObjectMapping kullanmaRestKit Dinamik olarak Harita İlişki Adına Göre Değer

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

. Bu iyi çalışıyor.

Şu anda Event üzerinde iki ilişki vardır User ve Photo. Şimdi konu dizilimini "subject_type" değerine göre uygun Çekirdek Verileri nesnesine eşleştirmem ve Event üzerinde doğru ilişkiyi ayarlamam gerekiyor.

RKDynamicObjectMapping kullanmayı denedim, ancak bunu "dinamik ilişki" için nasıl belirteceğimi bilmiyorum. Hedef ilişkinin adını subject_type değerine dayanarak ayarlamanın bir yoluna ihtiyacım var.

Herhangi bir düşünce?

+0

buradan biri gerçek soruyu yanıtladı diliyorum. – magma

cevap

1

, RKDynamicMapping da belirli bir bloğun kullanımı açıkladığınız gibi daha karmaşık dinamik haritalama işlemleri yapmanızı sağlar . Bu yeteneği kazandırır belirli yöntem İşte

setObjectMappingForRepresentationBlock denir yöntem üzerinde bazı dokümanlar şunlardır: http://restkit.org/api/latest/Classes/RKDynamicMapping.html#//api/name/setObjectMappingForRepresentationBlock:

RestKit birim testler bu yöntem için bazı basit durumları göstermektedir.

0

RKDynamicObjectMapping'u kullanabilmeniz gerekir (bkz. Object Mapping). Bu gibi RKDynamicObjectMapping kullanmak ardından Kullanıcı eşlemesi ve Fotoğraf eşlemesi oluşturmak ve verebilir: RestKit yılında

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

Şimdi bunu "Etkinlik" varlığına göre ayarlıyorum, böylece uygun ilişkiyi kullanıyor? – brynbodayle

0

Son zamanlarda bu soruna girdim. RestKit ile izleme, tüm nesne eşlemelerini bir RKDynamicMapping örneğindeki tüm ilişkilere uygulamayı deniyor gibi görünüyor. Bkz. applyRelationshipMappings, RKMappingOperation.m

Bir kesmek olan bir çözüm buldum, ancak restkit kodunu büyük ölçüde değiştirmem gerekmedi.

destinationObjectForMappingRepresentation:parentRepresentation:withMapping:inRelationship: 

I (yorum ile başlayarak) aşağıdaki kodu ilave ediliyor olduğu ilişkinin hedef nesnenin aynı tip olup olmadığını kontrol eder: RKMappingOperation.m olarak

, aşağıdaki yöntem modifiye uygulanır ve sadece eşleşiyorsa devam eder. (Bu tutarlı test olmadı, ama benim özel kullanım durumunda çalışmaktadır.)

- (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; 
      } 
     } 

...