2016-01-29 5 views
0

Heres мой сценарий. Большинство моих сетевых вызовов теперь должны иметь ключ api, вставленный в поле заголовка при выполнении запроса. Так что я думал, что могу сделать, это сделать категорию NSMutableUrlRequest. Переопределите один из инициаторов. Тогда в этом одном инициализаторе я мог бы установить ключ api в качестве поля заголовка. Поэтому каждый раз, когда я создаю объект NSMUTABLEURLREQUEST, поле заголовка, которое мне нужно, уже установлено. Если вы посмотрите на яблочный документ здесь NSMutableUrlRequest, вы увидите, что у объекта есть 4 инициализатора 2 класса и 2 метода экземпляра. Ill список моих вопросовПереопределение статического инициализатора NSMutableUrlRequest?

  1. Какую функцию инициализатора я должен переопределить для выполнения моей задачи? Класс или экземпляр?
  2. Как я могу переопределить его? Либо если это инициализатор экземпляра или класса?
  3. Это даже хороший способ сделать это? или я должен просто подклассировать его и переопределить его так?

Мой код написан для когда-то сейчас и хорошо, я не хочу возвращаться и вставлять ключ api в каждый отдельный запрос, потому что хорошо их много. В некотором смысле, я думаю, что это лучший подход к нему, потому что просто нужно установить apiKey в одном месте и не так много места, что уменьшает вероятность ошибок программирования. Спасибо вам за помощь.

P.S. Даже если это не хороший способ завершить это, может кто-нибудь еще показать мне, как работает инициализатор класса? Как и то, что основной код, чтобы я мог генерировать свои собственные инициализаторы статического класса. Каждый раз, когда я пытаюсь переопределить метод класса, я не могу определить, какой тип будет возвращен.

Спасибо за вашу помощь

+0

Может вы не цикл через процесс создания с вашими желаемыми заголовками, вставляя их? for (x в заголовках) {создать запрос с x} - что-то в этом роде? –

+0

Нет, потому что все запросы не входят в один класс. Мне просто нужно подклассировать NSURLRequest и добавить ключ api. Это исправит мою проблему, и я просто прочитаю здесь на этой [веб-странице] (http://rypress.com/tutorials/objective-c/categories), что ее не очень хорошая практика для переопределения методов в категории. Поскольку, если вы создаете другую категорию из той же цели класса c не знаете, какую функцию вызывать – Esko918

ответ

1

Категория не предназначена для использования для переопределения. Вы используете категории, когда хотите добавить дополнительные функции к существующим классам. Если вы действительно хотите переопределить инициализаторы, используйте наследование.

Статические функции не являются инициализаторами, они просто вспомогательные функции, которые создают для вас экземпляр, поэтому их не нужно обрабатывать. Простой метод initWithURL: - это просто упрощенная версия, которая предоставляет значения по умолчанию для назначенного инициализатора initWithURL:cachePolicy:timeoutInterval:; так что в вашем подклассе вы на самом деле нужно только переопределить это единственный инициализатору, ищу что-то вроде этого:

@interface MyNSMutableURLRequest : NSMutableURLRequest 
@end 

@implementation MyNSMutableURLRequest 

- (instancetype)initWithURL:(NSURL *)URL cachePolicy:(NSURLRequestCachePolicy)cachePolicy timeoutInterval:(NSTimeInterval)timeoutInterval { 
    self = [super initWithURL:URL cachePolicy:cachePolicy timeoutInterval:timeoutInterval]; 
    if (self) { 
     //do your stuff here 
    } 
    return self; 
} 
+0

Вы правы, я читал в Интернете, что это нехорошо переоценивать базовые классы, поскольку, если вы это сделаете, и вам придется потом создать другую категорию из того же класса, компилятор не знал бы, какой метод использовать. Так что я просто собираюсь использовать наследование. – Esko918

+0

Я добавил веб-страницу в свой комментарий в исходном посте, если кто-то хочет ее прочитать – Esko918

 Смежные вопросы

  • Нет связанных вопросов^_^