2014-09-30 9 views
7

मैं एक ही कक्षा में किसी अन्य संपत्ति के आधार पर संपत्ति वर्ग चुनने के लिए गिथब मैटल का उपयोग कैसे कर सकता हूं? (या बदतर मामले में 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

मैं ने वही समस्या मिला है, और मुझे लगता है मेरी समाधान बहुत तुम्हारा की तुलना में बेहतर नहीं है।

मेरे पास मैटल ऑब्जेक्ट्स के लिए एक सामान्य बेस क्लास है, और प्रत्येक के निर्माण के बाद, मैं एक कॉन्फ़िगरेशन विधि कहता हूं ताकि उन्हें एक से अधिक "आधार" (== 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

संबंधित मुद्दे