Строки с пробелами не удалось преобразовать в 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 для вашей работы.

Другие вопросы по тегам