I had to do something similar. I looked at the implementation of mtl_JSONArrayTransformerWithModelClass which transforms an array of dictionaries to and from an array of MTLModels. So I made a similar transformer which expects an array of array of dictionaries/MTLModels. I iterate over the outermost array and transform each array of dictionaries with the mtl_JSONArrayTransformerWithModelClass.
+ (NSValueTransformer *)JSONArrayOfArraysTransformerWithModelClass:(Class)modelClass
NSValueTransformer *arrayTransformer = [NSValueTransformer mtl_JSONArrayTransformerWithModelClass:modelClass];
return [MTLValueTransformer
reversibleTransformerWithForwardBlock:^id(NSArray *arrays) {
if (arrays == nil) return nil;
NSAssert([arrays isKindOfClass:NSArray.class], @"Expected an array, got: %@", arrays);
NSMutableArray *modelArrays = [NSMutableArray arrayWithCapacity:[arrays count]];
for (id JSONArray in arrays) {
if (JSONArray == NSNull.null) {
[modelArrays addObject:JSONArray];
continue;
}
NSAssert([JSONArray isKindOfClass:NSArray.class], @"Expected an array of arrays of dictionaries, got array of: %@", JSONArray);
NSArray *modelArray = [arrayTransformer transformedValue:JSONArray];
if (modelArray == nil) continue;
[modelArrays addObject:modelArray];
}
return modelArrays;
}
reverseBlock:^id(NSArray *arrays) {
if (arrays == nil) return nil;
NSAssert([arrays isKindOfClass:NSArray.class], @"Expected an array of arrays of MTLModels, got: %@", arrays);
NSMutableArray *modelArrays = [NSMutableArray arrayWithCapacity:modelArrays.count];
for (id modelArray in arrays) {
if (modelArray == NSNull.null) {
[modelArrays addObject:NSNull.null];
continue;
}
NSAssert([modelArray isKindOfClass:NSArray.class], @"Expected an array of arrays, got array of: %@", modelArray);
NSArray *array = [arrayTransformer reverseTransformedValue:modelArray];
if (array == nil) continue;
[modelArrays addObject:array];
}
return modelArrays;
}];
}