2014-09-30 6 views
7

Github Mantle을 사용하여 동일한 클래스의 다른 속성을 기반으로 속성 클래스를 선택하려면 어떻게해야합니까? (또는 더 나쁜 경우 JSON 객체의 다른 부분).맨 틀 속성 클래스는 다른 속성을 기반으로합니까?

예를 들어

나는이 같은 객체가있는 경우 :

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

그러나 변압기 만 '내용'을 포함에 전달 된 사전 :

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

내가 이런 변압기를 만들고 싶어를 JSON의 조각, 그래서 '형식'필드에 액세스 할 수 없습니다. 어쨌든 객체의 나머지 부분에 액세스 할 수 있습니까? 아니면 어떻게 든 '형식'에 '콘텐츠'의 모델 클래스를 기본으로?

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

답변

0

나는 비슷한 문제를 했어, 그리고 내 솔루션은 훨씬 당신보다 더 나은되지 않습니다 의심 :

나는 이전에이 같은 해킹 솔루션을하도록 강요하고있다.

맨틀 객체에 대한 공통 기본 클래스가 있고 각각이 생성 된 후에 configure 메소드를 호출하여 둘 이상의 "기본"(== JSON) 속성에 종속 된 속성을 설정할 수있는 기회를 제공합니다 . 이처럼

:

+(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

당신은 JSONKeyPathsByPropertyKey 방법을 수정하여 유형 정보를 전달할 수 있습니다

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

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

을, 당신은 "유형"속성에 액세스 할 수 있습니다

+0

완벽한 솔루션입니다! 감사. 많은 문제가 해결되었습니다. – CFIFok