27

If I have a dictionary like

{
  name: "Bob",
  cars: [
    { make: "ford", year: "1972" },
    { make: "mazda", year: "2000" }
  ],
}

and two models like:

@interface CarModel : MTLModel

@property (nonatomic, strong) NSString *make;
@property (nonatomic, strong) NSString *year;

@end

@interface PersonModel : MTLModel

@property (nonatomic, strong) NSString *name;
@property (nonatomic, strong) NSArray *cars;

@end

How do I use Mantle so that my array of cars in my person model are CarModels?

akashivskyy
  • 44,342
  • 16
  • 106
  • 116
Mr Rogers
  • 6,091
  • 2
  • 32
  • 34

5 Answers5

21

Ah figured it out. I needed to add a private method:

+ (NSValueTransformer *)carsTransformer
{
    return [NSValueTransformer mtl_externalRepresentationArrayTransformerWithModelClass:[CarModel class]];
}

and make sure I used:

[PersonModel modelWithExternalRepresentation:dict];
Kyle Clegg
  • 38,547
  • 26
  • 130
  • 141
Mr Rogers
  • 6,091
  • 2
  • 32
  • 34
  • 6
    This method is deprecated, the new one is: [NSValueTransformer mtl_JSONArrayTransformerWithModelClass:[CarModel class]]; – KrauseFx Aug 23 '13 at 19:14
  • It didn't seem to drop into the property transformer method until I parsed the JSON like this: MyModelClass * myModel = [MTLJSONAdapter modelOfClass:[MyModelClass class] fromJSONDictionary:jsonDictionary error:&error]; – slim Aug 23 '13 at 22:27
  • Don't forget `#import ` – Kyle Clegg Jun 03 '14 at 18:20
  • 3
    now you have to use [MTLJSONAdapter arrayTransformerWithModelClass:[CarModel class]]; – gaRik Oct 14 '15 at 16:59
13

+[NSValueTransformer mtl_externalRepresentationArrayTransformerWithModelClass:] is deprecated. The new API is +[NSValueTransformer mtl_JSONArrayTransformerWithModelClass:].

After switching to the new API, the models can be initialized with the default initializers provided by, e.g., MTLJSONAdapter.

Manuel Binna
  • 1,225
  • 2
  • 14
  • 23
12

A note on:

[NSValueTransformer mtl_JSONArrayTransformerWithModelClass:CarModel.class];

This methods seems to now be deprecated. I'm using this new method in my code and it appears to be working just fine:

[MTLJSONAdapter arrayTransformerWithModelClass:CarModel.class];
Brian Sachetta
  • 3,319
  • 2
  • 34
  • 45
4
+ (NSValueTransformer *)carsJSONTransformer {
    return [NSValueTransformer mtl_JSONArrayTransformerWithModelClass:CarModel.class];
}

Read more here

onmyway133
  • 45,645
  • 31
  • 257
  • 263
0
+[NSValueTransformer mtl_JSONArrayTransformerWithModelClass:]

This method is deprecated. New method is:

  + (NSValueTransformer *)carsTransformer
    {
        return [MTLJSONAdapter arrayTransformerWithModelClass:[CarsModel class]];
    }
Clown
  • 163
  • 1
  • 12