2014-09-30 44 views
7

Jak mogę użyć Github Mantle, aby wybrać klasę właściwości na podstawie innej właściwości w tej samej klasie? (lub w gorszym przypadku inna część obiektu JSON).Klasa właściwości płaszcza na podstawie innej właściwości?

Na przykład jeśli mam obiektu takiego:

{ 
    "content": {"mention_text": "some text"}, 
    "created_at": 1411750819000, 
    "id": 600, 
    "type": "mention" 
} 

Chcę zrobić transformator tak:

+(NSValueTransformer *)contentJSONTransformer { 
    return [MTLValueTransformer transformerWithBlock:^id(NSDictionary* contentDict) { 
      return [MTLJSONAdapter modelOfClass:ETMentionActivityContent.class fromJSONDictionary:contentDict error:nil]; 
    }]; 
} 

ale słownika przekazywane do transformatora obejmuje jedynie „content” część JSON, więc nie mam dostępu do pola "typ". Czy mimo to masz dostęp do reszty obiektu? Lub w jakiś sposób oprzeć modelową klasę "treści" na "typie"?

już wcześniej został zmuszony do rozwiązania hackerskich zrobić tak:

+(NSValueTransformer *)contentJSONTransformer { 
    return [MTLValueTransformer transformerWithBlock:^id(NSDictionary* contentDict) { 
     if (contentDict[@"mention_text"]) { 
      return [MTLJSONAdapter modelOfClass:ETMentionActivityContent.class fromJSONDictionary:contentDict error:nil]; 
     } else { 
      return [MTLJSONAdapter modelOfClass:ETActivityContent.class fromJSONDictionary:contentDict error:nil]; 
     } 
    }]; 
} 

Odpowiedz

0

miałem podobny problem, i podejrzewam, że moje rozwiązanie nie jest dużo lepiej niż ty.

Mam wspólną klasę podstawową dla moich obiektów typu Mantle, a po każdym jest wywoływana metoda configure, aby dać im szansę na skonfigurowanie właściwości, które są zależne od więcej niż jednej właściwości "base" (== JSON) .

Jak to:

+(id)entityWithDictionary:(NSDictionary*)dictionary { 

    NSError* error = nil; 
    Class derivedClass = [self classWithDictionary:dictionary]; 
    NSAssert(derivedClass,@"entityWithDictionary failed to make derivedClass"); 
    HVEntity* entity = [MTLJSONAdapter modelOfClass:derivedClass fromJSONDictionary:dictionary error:&error]; 
    NSAssert(entity,@"entityWithDictionary failed to make object"); 
    entity.raw = dictionary; 
    [entity configureWithDictionary:dictionary]; // Give the new entity a chance to set up derived properties 
    return entity; 
} 
5

Możesz przekazać informacje o typie modyfikując metodę JSONKeyPathsByPropertyKey:

+ (NSDictionary *)JSONKeyPathsByPropertyKey 
{ 
    return @{ 
     NSStringFromSelector(@selector(content)) : @[ @"type", @"content" ], 
    }; 
} 

Następnie w contentJSONTransformer, można uzyskać dostęp do "typ" właściwość:

+ (NSValueTransformer *)contentJSONTransformer 
{ 
    return [MTLValueTransformer ... 
     ... 
     NSString *type = value[@"type"]; 
     id content = value[@"content"]; 
    ]; 
} 
+0

To idealne rozwiązanie! Dzięki. Wiele problemów zostało rozwiązanych. – CFIFok

Powiązane problemy