2011-09-19 17 views
7

Uygulamamda kaynakları algılamak ve varsa bir önbellek dizininden yüklemek için özel bir NSURLProtocol kullanıyorum veya uygulamanın sunucusuna yeniden yönlendiriyorum. Bununla birlikte, eksik olmaları için soyut yöntemlerin belgelerini buluyorum ve uygulamak zorunda olduğumuz bazı soyut yöntemlerle ne yapacağımızdan emin değilim.NSURLProtocol'un soyut yöntemleri

Biz uygulamalıdır:

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

canInitWithRequest kolaydır, bu size bu talebe cevap verecektir NSURLProtocol söylemek nasıl.

canonicalRequestForRequest: ile ne yapacağımı bilmiyorum. startLoading: yılında

, ben de o zaman client yöntemler arayarak, yerel bir dosyadan benim yanıtı oluşturarak veya synchroniously uzak bir dosyayı alma edilmiştir:

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

Ben müşteri aramak gerekirse Bana belirsizdir protokol yöntemi:

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

I (henüz önbelleğe alınmayınca) uzak sunucudan kaynak getirmesi karar verirler.

Son olarak, henüz kimse bu yöntemler yapmaları beklenmektedir şeyin daha biliyorsa stopLoading:

ile ne çözemedim, senin anlayışlar çok takdir edilmektedir.

cevap

5

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

kanonik ‘araçları "Her somut protokol uygulamasına kadar ne tanımlamak için’bir protokol Aynı giriş istek her zaman aynı verir garanti etmelidir. kanonik formu.

bir isteğin kanonik formu eşitlik denetler bahis gerçekleştiren bir süreç URL önbelleği nesneleri arama için kullanıldığından bu yöntemi, uygularken

Özel bir önem verilmelidir ween NSURLRequest nesneleri. "

söylediğini Tümü

geçerli:

ETKİLİ aynı URL iki istekleri ... TAM OLARAK aynı istek-dize

kullanarak sonuna emin olun ... bu yüzden Birini istemek, varsa, önbelleğin önbelleğe alınmış sürümünü döndürür.

İsteğinizi tekrar geri göndermeniz için Tamam olmanız gerekir. URLencok kodlanmamış olması gereken karakterleri kontrol ederek yapabilirsiniz (örneğin, kodlanmış bir tire/tire işareti varsa).


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

"protokol uygulaması yönlendirildi URL yükleme sistemine belirtmek için Gönderilen (gerekli)."

yani istek, bir HTTP yönlendirme kodu (örn. 30x durum kodu) aracılığıyla yeniden yönlendirildiyse SADECE bunu çağırırsınız.

NOT: stackoverflow BÖCEK Ben Örneğin BURADA

ARANIYOR NE TİP anlamına, bir sunucu yönlendirebilir "http: // sunucu" "http: // sunucu/index.html" - ve bu Geri arama, alıcıya, kendisine sorulandan biraz farklı bir URL'den yanıt alacağını bildirmenizi sağlar.

Yine, bu, önbelleğe alma işleminin doğru yapılması için gereklidir.