Я бы сделал объект, который делает это одно и делает это правильно.
Одна ключевая вещь, на которую вы должны обратить внимание - это убедиться, что вы правильно экранировали все свои имена и значения. Например, если вы передадите значение «fred & wilma», оно не должно отображаться в URL как «members = fred & wilma» - вам нужно экранировать & (как %26
).
Вы могли бы просто избегать каждой строки, когда сшиваете ее, но было бы слишком легко забыть сделать это. Все, что повторяется в коде, слишком легко пропустить.
Это главная причина, по которой я бы сделал объект для этого. Этот объект будет не только скреплять строки, но и избегать их соответствующим образом.
Я предполагаю, что вам не нужно искать значения ключей позже. Вы просто хотите создать URL.
Во-первых, объект должен содержать NSMutableString, в частном порядке (не публичный @property
- либо личный @property
, либо переменная экземпляра). Он должен создать это при инициализации и удерживать его всю жизнь.
Назначенный инициализатором объекта должен быть что-то вроде initWithResourceURLString:
. Этот метод отправляет в строку сообщение mutableCopy
и присваивает результат переменной экземпляра или частному свойству. init
должен выдать исключение (проще всего, утверждая false
).
Объект также должен иметь переменную экземпляра для одного unichar
. initWithResourceURLString:
следует установить на '?'
.
Объект должен ответить на сообщение, такое как setQueryParameterWithName:toValue:
. Каждый аргумент должен быть строкой. Если любая из этих строк nil
, метод просто возвращает.
Этот метод отправляет каждую строку stringByAddingPercentEscapesUsingEncoding:
сообщение , а затем отправляет изменяемой строке сообщение appendFormat:
в следующем формате:
%C%@=%@
с аргументами, являющимися символом в переменной экземпляра unichar
, именем экранированного параметра и экранированным значением. Затем он устанавливает символьную переменную на &
.
Объект должен ответить на сообщение, такое как constructedURLString
, возвращая копию (автоматически выпущенную, если вы используете MRC) изменяемой строки.
Затем вы бы использовали этот объект так:
builder = [[MyURLBuilder alloc] initWithResourceURLString:@"http://example.com/getCountries"]; //Add autorelease under MRC
[builder setQueryParameterName:@"continent" toValue:continent];
[builder setQueryParameterName:@"language" toValue:language];
[builder setQueryParameterName:@"timeZone" toValue:timeZone];
NSURL *finishedURL = [NSURL URLWithString:[builder constructedURLString]];
Преимущества:
- У вас есть ровно одно место, чтобы убедиться, что выход выполняется правильно. Весь другой код не должен беспокоиться об этом.
- У вас есть ровно одно место, чтобы убедиться, что
nil
обрабатывается (игнорируется) правильно. Весь другой код не должен беспокоиться об этом.
- Заказ сохранен. Словарь может изменить порядок аргументов. Это не должно иметь значения (сервер не должен заботиться), но если это так, то вам нужно решение для сохранения порядка.
- Было бы легко написать модульные тесты для этого объекта.
- Если вы хотите, вы можете изменить этот объект в нескольких направлениях. Например, вы можете добавить поддержку для сброса URL составленного запроса без изменения или необходимости отдельно запоминать базовый URL, что позволяет повторно использовать этот объект для нескольких запросов. Вы также можете добавить поддержку замены пустой строки на
nil
для любого или только для некоторых параметров. Любые изменения, внесенные вами в класс, будут немедленно доступны для любых других ваших заданий по созданию URL.