2011-09-19 9 views
7

Używam niestandardowego NSURL Protococol w mojej aplikacji do wykrywania zasobów i ładowania z katalogu pamięci podręcznej, jeśli jest dostępny, lub przekierowania z powrotem do serwera mojej aplikacji. Jednak brakuje mi dokumentacji dotyczącej metod abstrakcyjnych i nie jestem pewien, co zrobić z niektórymi metodami abstrakcyjnymi, które musimy wdrożyć.Metody abstrakcyjne NSURL Protococol

Musimy wdrożyć:

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

canInitWithRequest jest łatwe, to jak powiedzieć NSURLProtocol że będzie reagować na to żądanie.

Nie mam pojęcia, co zrobić z canonicalRequestForRequest:.

W startLoading:, byłem albo tworząc moją odpowiedź z pliku lokalnego lub synchroniously pobierania zdalnego pliku, a następnie wywołanie client metody:

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

Jest dla mnie jasne, czy muszę zadzwonić do klienta metoda protokołu:

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

Kiedy zdecyduję się pobrać zasób ze zdalnego serwera (jeśli nie został jeszcze buforowany).

Wreszcie, jeszcze nie zorientowali się, co zrobić z stopLoading:

Jeśli ktoś wie więcej o tym, co oczekuje te metody to zrobić, twoje spostrzeżenia są bardzo cenione.

Odpowiedz

5

canonicalRequestForRequest - Od docs (https://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Classes/NSURLProtocol_Class/Reference/Reference.html)

„To do każdej konkretnej implementacji protokołu określić, co «kanonicznych»oznacza Protokół powinien zagwarantować, że samo wejście prośba zawsze daje takie same.

Należy zwrócić szczególną uwagę podczas implementacji tej metody, , ponieważ forma kanoniczna zapytania służy do wyszukiwania obiektów w pamięci podręcznej adresów URL, proces, który wykonuje test równości ween Obiekty NSURLRequest. "

Wszystko to jest powiedzenie:

Upewnij się, że dwa wnioski, które są faktycznie takie same URL ... kończy się przy użyciu dokładnie takie same żądania stringi

... tak ten, który zażąda jednego, zwróci wersję wcześniej buforowaną drugiej, jeśli jest dostępna.

Powinieneś być w porządku, aby po prostu zwrócić żądanie ponownie. Możesz go sfinalizować, zaznaczając znaki, które nie muszą być kodowane przez URL, ale są (na przykład, jeśli istnieje zakodowany dosłowny kreska/myślnik).


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

"Wysłane do wskazania systemu załadunku URL że implementacja protokołu został przekierowany (wymagane)."

tj TYLKO wywołasz to, jeśli żądanie zostało przekierowane za pomocą kodu przekierowania HTTP (np. kod statusu 30x).

UWAGA: Błędy w StackOverflow znaczy, że nie można wpisać co chciałem TUTAJ

Na przykład, serwer może przekierować "http: // serwer" na "http: // serwer/index.html" - i to callback pozwala poinformować odbiorcę, że otrzyma odpowiedź z nieco innego adresu URL niż ten, którego zażądała.

Ponownie, jest to konieczne do prawidłowego buforowania itp.