NSURLProtocol абстрактные методы - PullRequest
       1

NSURLProtocol абстрактные методы

7 голосов
/ 19 сентября 2011

Я использовал собственный NSURLProtocol в моем приложении для обнаружения ресурсов и загрузки из каталога кэша, если он доступен, или для перенаправления обратно на сервер моего приложения. Однако я считаю, что документации по абстрактным методам не хватает, и я не уверен, что делать с некоторыми из абстрактных методов, которые мы должны реализовать.

Мы должны реализовать:

+ (BOOL)canInitWithRequest:(NSURLRequest *)request
+ (NSURLRequest *)canonicalRequestForRequest:(NSURLRequest *)request
- (void)startLoading
- (void)stopLoading

canInitWithRequest просто, вот как вы сообщаете NSURLProtocol, что ответите на этот запрос.

Понятия не имею, что делать с canonicalRequestForRequest:.

В startLoading: я либо создавал свой ответ из локального файла, либо синхронно извлекал удаленный файл, а затем вызывал методы client:

[self.client URLProtocol:self didReceiveResponse:response cacheStoragePolicy:NSURLCacheStorageAllowed];
[self.client URLProtocol:self didLoadData:responseData];
[self.client URLProtocolDidFinishLoading:self];

Мне неясно, нужно ли мне вызывать метод протокола клиента:

 - (void)URLProtocol:(NSURLProtocol *)protocol wasRedirectedToRequest:(NSURLRequest *)request redirectResponse:(NSURLResponse *)redirectResponse

Когда я решаю извлечь ресурс с удаленного сервера (когда он еще не был кэширован).

Наконец, я еще не понял, что делать с stopLoading:

Если кто-то знает больше о том, что эти методы должны делать, ваши идеи очень ценятся.

1 Ответ

5 голосов
/ 01 апреля 2013

canonicalRequestForRequest - Из документов (https://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Classes/NSURLProtocol_Class/Reference/Reference.html)

"Каждое конкретное выполнение протокола определяет, что означает" канонический ". Протокол должен гарантировать, что один и тот же запрос ввода всегда даетта же каноническая форма.

Особое внимание следует уделить реализации этого метода, поскольку каноническая форма запроса используется для поиска объектов в кэше URL-адресов, процесс, который выполняет проверки на равенство между объектами NSURLRequest. "

Все, что он говорит, это:

Убедитесь, что два запроса, которые ЭФФЕКТИВНО одинаковы для URL ... в конечном итоге используют ТОЛЬКО одну и ту же строку запроса

... так что запрашивающий один возвратит предварительно кэшированную версию другого, если он доступен.

Вы должны быть в порядке, чтобы просто вернуть запрос обратно. Вы могли бы уточнить его, проверив наличие символовкоторые не должны быть кодированы URL, но есть (например, если есть буквальный дефис / дефис).


wasRedirectedToRequest - from docs (https://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Protocols/NSURLProtocolClient_Protocol/Reference/Reference.html)

"Отправлено, чтобы указать системе загрузки URL-адресов, что реализация протокола была перенаправлена.(обязательно) "

т.е. вы ТОЛЬКО вызываете это, если запрос был перенаправлен через HTTP-код перенаправления (например, код состояния 30x).

ПРИМЕЧАНИЕ.ТИП, ЧТО Я ХОТЕЛ ЗДЕСЬ

Например, сервер может перенаправить «http: // server» на «http: // server / index.html» - и этот обратный вызов позволяет вам сообщить получателю, что он собираетсяполучить ответ по несколько другому URL, чем тот, который он запрашивал.

Опять же, это необходимо для правильного кэширования и т. д.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...