Переопределить статический инициализатор NSMutableUrlRequest?
Вот мой сценарий. Большинство моих сетевых вызовов теперь должны иметь ключ api, вставленный в поле заголовка при выполнении запроса. Так что я подумал, что смогу сделать категорию NSMutableUrlRequest. Переопределите один из инициализаторов. Затем в этом одном инициализаторе я мог бы установить ключ API в качестве поля заголовка. Поэтому каждый раз, когда я создаю объект NSMUTABLEURLREQUEST, поле заголовка, которое мне нужно, уже установлено. Если вы посмотрите на документ Apple здесь NSMutableUrlRequest, вы увидите, что объект имеет 4 инициализатора, 2 класса и 2 метода экземпляра. Я перечислю мои вопросы
- Какую функцию инициализатора я должен переопределить, чтобы завершить мою задачу? Класс или экземпляры?
- Как я могу переопределить это? Либо, если это экземпляр или инициализатор класса?
- Это даже хороший способ сделать это? или я должен просто создать подкласс и переопределить его так?
Мой код уже давно написан, и я не хочу возвращаться и вставлять ключ api в каждый отдельный запрос, потому что их очень много. В некотором смысле, я думаю, что это лучший подход к этому, потому что мне просто нужно установить apiKey в одном месте, а не во многих местах, что уменьшает вероятность ошибок программирования. Спасибо за вашу помощь.
PS Даже если это не хороший способ завершить это, может кто-то еще покажет мне, как работает инициализатор класса? Как то, что лежит в основе кода, чтобы я мог генерировать свои собственные инициализаторы статического класса также. Каждый раз, когда я пытаюсь переопределить метод класса, я не могу понять, какой тип вернуть.
Спасибо за помощь
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;
}