2014-09-30 12 views
7

Làm cách nào để sử dụng Github Mantle để chọn một lớp thuộc tính dựa trên một thuộc tính khác trong cùng một lớp? (hoặc trong trường hợp xấu hơn một phần khác của đối tượng JSON).Lớp thuộc tính Mantle dựa trên tài sản khác?

Ví dụ nếu tôi có một đối tượng như thế này:

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

Tôi muốn làm một máy biến áp như thế này:

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

Nhưng điển truyền cho biến chỉ bao gồm các 'nội dung' một phần của JSON, vì vậy tôi không có quyền truy cập vào trường 'loại'. Có cách nào để truy cập phần còn lại của đối tượng không? Hoặc bằng cách nào đó cơ sở lớp mô hình của 'nội dung' trên 'loại'?

Tôi đã từng bị buộc phải làm giải pháp Hack như thế này:

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

Trả lời

0

Tôi đã có một vấn đề tương tự, và tôi nghi ngờ giải pháp của tôi không phải là tốt hơn so với bạn nhiều.

Tôi có một lớp cơ sở chung cho các đối tượng Mantle của mình và sau mỗi lần xây dựng, tôi gọi phương thức cấu hình để cho họ cơ hội thiết lập thuộc tính phụ thuộc vào nhiều thuộc tính "cơ sở" (== JSON) .

Như thế này:

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

Bạn có thể vượt qua các loại thông tin bằng cách sửa đổi JSONKeyPathsByPropertyKey phương pháp:

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

Sau đó, trong contentJSONTransformer, bạn có thể truy cập vào "gõ" bất động sản:

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

Đó là giải pháp hoàn hảo! Cảm ơn. Nhiều vấn đề đã được giải quyết. – CFIFok

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