Как обрабатывать непредвиденные типы данных с помощью Mantle
В моем подклассе MTLModel у меня есть это:
@property (assign, nonatomic) NSInteger catId;
И конечно это при реализации:
+ (NSDictionary *)JSONKeyPathsByPropertyKey {
return @{
@"catId" : @"cat_id"
};
}
Но что, если мои друзья на сервере решат изменить cat_id на строку в ответе JSON? Как я могу обработать этот случай и преобразовать его в int, чтобы я не получал ошибки Mantle?
2 ответа
Мы также использовали Mantle довольно долгое время, но в конце перешли на рукописный анализатор / сериализаторы, так как сама задача кажется тривиальной.
Однако у нас также есть проблемы такого рода: что, если сервер вернет то, чего мы не ожидаем (например, NSDictionary
вместо NSString
).
Чтобы предотвратить сбои нашего приложения, мы используем этот простой инструмент: Fuzzer.
В основном инструмент предоставляет метод, который берет образец и блок. Блок оценивается несколько раз, каждый раз принося слегка видоизмененную версию семпла. Вы можете проверить поведение моделей / анализаторов / сериализаторов, используя мутанты, чтобы убедиться, что ваш код корректно обрабатывает неожиданные данные.
Вот пример, взятый из проекта README:
- (void)test {
NSDictionary *sample = @{
@“name” : @“John Doe”,
@“age” : @42
};
UserDeserializer *deserializer = [UserDeserializer new];
FZRRunner *runner = [FZRRunner runnerWithBuiltinMutationsForSample:sample];
NSArray *reports = [runner enumerateMutantsUsingBlock:^(NSDictionary *mutant) {
[deserializer deserializeUser:mutant];
}];
XCTAssertEqual(reports.count, 0);
}
if([obj isKindOfClass:NSClassFromString(@"__NSCFNumber")])
{
//if it is int or number
}
else
{
}
Может быть, выше метод поможет вам