接口

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;
    }
}
Copyright © 屯昌單支科技有限公司 2019 all right reserved,powered by Gitbook聯系方式: wanglihang@mskj.com
修訂時(shí)間: 2019-08-02 16:19:33

results matching ""

    No results matching ""