Строки с пробелами не удалось преобразовать в NSURL - Mantle
Хотелось бы знать, есть ли в любом случае исправление ошибки при преобразовании строки с пробелом в NSURL в Mantle?
Я получаю ошибку ниже Мантии:
Ошибка Domain=MTLTransformerErrorHandlingErrorDomain Code=1 "Не удалось преобразовать строку в URL", NSLocalizedDescription = Не удалось преобразовать строку в URL-адрес, NSLocalizedFailureReason = Входная строка URL-адреса https://x.com/dev-pub-image-md/x-img/02020-x yy z@2X.png был искажен}
Ниже файлы классов;
.h -
#import "Mantle.h"
@interface Place : MTLModel <MTLJSONSerializing>
@property (strong, nonatomic) NSString *placeId;
@property (strong, nonatomic) NSURL *logoURL;
@end
.m -
#import "Place.h"
@implementation Place
+ (NSDictionary *)JSONKeyPathsByPropertyKey {
return @{@"placeId": @"placeId",
@"logoURL":@"circleImage"
};
}
+ (NSValueTransformer *)logoURLJSONTransformer {
return [NSValueTransformer valueTransformerForName:MTLURLValueTransformerName];
}
@end
Заранее спасибо!
2 ответа
Это происходит потому, что ваша строка не имеет конечного кода (URL не может содержать пробелов).
Первый - URL кодирует вашу строку, используя следующий метод. Источник: Stackru
- (NSString *)urlencodeString:(NSString*)string {
NSMutableString *output = [NSMutableString string];
const unsigned char *source = (const unsigned char *)[self UTF8String];
int sourceLen = strlen((const char *)source);
for (int i = 0; i < sourceLen; ++i) {
const unsigned char thisChar = source[i];
if (thisChar == ' '){
[output appendString:@"+"];
} else if (thisChar == '.' || thisChar == '-' || thisChar == '_' || thisChar == '~' ||
(thisChar >= 'a' && thisChar <= 'z') ||
(thisChar >= 'A' && thisChar <= 'Z') ||
(thisChar >= '0' && thisChar <= '9')) {
[output appendFormat:@"%c", thisChar];
} else {
[output appendFormat:@"%%%02X", thisChar];
}
}
return output;
}
А затем преобразовать его в URL.
В вашем конкретном сценарии вы работаете с преобразователями Mantle JSON. Итак, что вы можете сделать, это;
+ (NSValueTransformer *)logoURLJSONTransformer {
return [MTLValueTransformer transformerUsingReversibleBlock:^id(NSString *str, BOOL *success, NSError *__autoreleasing *error) {
if (success) {
NSString *urlEncodedString = [self urlencodeString:str];
return [NSURL URLWithString:urlEncodedString];
}else{
return @"";
}
}];
}
Ты можешь попробовать это
NSString *baseurlString = [NSString stringWithFormat:@"your_url_here"];
NSString *cleanedUrl = [baseurlString stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLFragmentAllowedCharacterSet]];
затем используйте это cleanedUrl
для вашей работы.