接口
FireflySessionURLProtocol
注冊、解注冊過濾器
+(void)filter_register:(nonnull Class)filter;
+(void)filter_unregister:(nonnull Class)filter;
+(void)filter_unregisterAll;
+(void)filter_setlist:(nullable NSArray<Class> *)list;
獲取當前注冊的(de)過濾器
+(nullable NSArray<Class> *)filter_getlist;
FireflySessionURLCustomFilter(過濾器)
調用順序
->ff_canDoWithRequest
->initWithRequest
->ff_GetLocalData 如果處理成功 則到(dào)此結束
->didReceiveData
->didCompleteWithError
是(shì)否可以(yǐ)處理某個(gè)具體請求
對應NSURLProtocol::canonicalRequestForRequest
隻有結果爲(wéi / wèi)YES時(shí),才會有(但不(bù)一(yī / yì /yí)定有)後續的(de)處理過程
+(BOOL)ff_canDoWithRequest:(NSURLRequest *_Nonnull)inRequest canonicalRequest:(NSURLRequest *_Nonnull*_Nullable)outRequest outUserData:(NSObject *_Nullable*_Nonnull)outUserData;
參數名稱 | 說(shuō)明 |
---|---|
inRequest | 傳入請求,需要(yào / yāo)對這(zhè)個(gè)請求判斷,确定是(shì)否可以(yǐ)處理 |
outRequest | 傳出(chū)請求,一(yī / yì /yí)般不(bù)做處理 |
outUserData | 用戶數據,将在(zài)整個(gè)過濾過程中投傳 |
初始化方法
-(id _Nonnull)initWithRequest:(NSURLRequest *_Nonnull)request userData:(NSObject *_Nullable)userData;
參數名稱 | 說(shuō)明 |
---|---|
request | 傳入請求 |
userData | 用戶數據,參考ff_canDoWithRequest的(de)outUserData |
請求
@property (nonatomic,strong,readonly,nonnull) NSURLRequest * request;
參考initWithRequest的(de)request
用戶數據
@property (nonatomic,strong,readonly,nullable) NSObject *userData;
參考initWithRequest的(de)userData
接收網絡數據
-(void)ff_URLSession:(NSURLSession *_Nonnull)session dataTask:(NSURLSessionDataTask *_Nonnull)dataTask didReceiveData:(NSData *_Nonnull)data;
參數名稱 | 說(shuō)明 |
---|---|
session | 請求回話 |
dataTask | 數據任務 |
data | 接收的(de)數據 |
網絡請求完成
-(void)ff_URLSession:(NSURLSession *_Nonnull)session task:(NSURLSessionTask *_Nonnull)task didCompleteWithError:(NSError *_Nullable)error;
參數名稱 | 說(shuō)明 |
---|---|
session | 請求回話 |
dataTask | 數據任務 |
error | 錯誤 |
獲取本地(dì / de)數據
-(void)ff_GetLocalDataFrom:(in unsigned long)inOffset
size:(in unsigned long)inSize
data:(out NSData *_Nonnull*_Nullable)outData
total:(out unsigned long *_Nonnull)outTotal
error:(out NSError *_Nonnull*_Nullable)outErr;
如果本地(dì / de)數據處理成功,則不(bù)過發起網絡請求;這(zhè)個(gè)方法可能會被多次調用,直到(dào)數據讀取完畢。數據讀取完畢的(de)判斷條件是(shì)outTotal < inSize
參數名稱 | 說(shuō)明 |
---|---|
inOffset | 期望讀取偏移 |
inSize | 期望讀取大(dà)小 |
outData | 讀取出(chū)來(lái)的(de)數據 |
outTotal | 讀取出(chū)來(lái)的(de)數據的(de)大(dà)小 |
outErr | 錯誤 |
本地(dì / de)文件路徑
-(NSString *_Nonnull)localFilePath;
如果确定過濾器可以(yǐ)處理請求,且本地(dì / de)有緩存文件,需要(yào / yāo)在(zài)這(zhè)個(gè)方法裏返回本地(dì / de)文件路徑。
清除本地(dì / de)文件
+(void)clearLocalFiles;
清除本地(dì / de)文件
+(void)clearLocalFiles;
獲取響應數據緩存
-(nullable NSURLResponse *)ff_GetLocalResponse;
FireflyWebImageCacheFilter(图片緩存)
是(shì)FireflySessionURLCustomFilter的(de)子(zǐ)類,重寫的(de)方法
+(BOOL)ff_canDoWithRequest:(NSURLRequest *)inRequest canonicalRequest:(NSURLRequest **)outRequest outUserData:(NSObject **)outUserData
{
if (!inRequest || !inRequest.URL)
return NO;
NSString *scheme = [inRequest.URL.scheme lowercaseString];
if (![scheme isEqualToString:@"http"] && ![scheme isEqualToString:@"https"])
return NO;
NSString *userAgent = [inRequest valueForHTTPHeaderField:@"User-Agent"];
if ([userAgent rangeOfString:@"AppleWebKit"].location == NSNotFound)
return NO;
NSString * ext = inRequest.URL.pathExtension.lowercaseString;
static NSArray *extlist = nil;
if (!extlist) extlist = @[@"jpg",@"jpeg",@"png",@"gif",@"tif",@"bmp",@"ico"];
return [extlist indexOfObject:ext] != NSNotFound;
}
-(NSString *)localFilePath
{
return @"具體文件的(de)本地(dì / de)路徑';
}
-(void)ff_GetLocalDataFrom:(in unsigned long)inOffset
size:(in unsigned long)inSize
data:(out NSData **)outData
total:(out unsigned long *)outTotal
error:(out NSError **)outErr
{
NSString * path = [self localFilePath];
if ([[NSFileManager defaultManager] fileExistsAtPath:path])
{
NSData *data = [NSData dataWithContentsOfFile:path];
if (!data || data.length == 0)
{//讀取文件錯誤或者空文件
[[NSFileManager defaultManager] removeItemAtPath:path error:nil];
return;
}
CGImageSourceRef source = CGImageSourceCreateWithData((CFDataRef)data, NULL);
if (!source)
{//图片初步解碼失敗
[[NSFileManager defaultManager] removeItemAtPath:path error:nil];
return;
}
CFRelease(source);
*outData = data;
*outTotal = data.length;
}
}