接口

FireflySessionURLProtocol

注册、解注册过滤器

+(void)filter_register:(nonnull Class)filter;
+(void)filter_unregister:(nonnull Class)filter;
+(void)filter_unregisterAll;
+(void)filter_setlist:(nullable NSArray<Class> *)list;

获取当前注册的过滤器

+(nullable NSArray<Class> *)filter_getlist;

FireflySessionURLCustomFilter(过滤器)

调用顺序

 ->ff_canDoWithRequest
 ->initWithRequest
 ->ff_GetLocalData 如果处理成功 则到此结束
 ->didReceiveData
 ->didCompleteWithError

是否可以处理某个具体请求

对应NSURLProtocol::canonicalRequestForRequest

只有结果为YES时,才会有(但不一定有)后续的处理过程

+(BOOL)ff_canDoWithRequest:(NSURLRequest *_Nonnull)inRequest canonicalRequest:(NSURLRequest *_Nonnull*_Nullable)outRequest outUserData:(NSObject *_Nullable*_Nonnull)outUserData;
参数名称 说明
inRequest 传入请求,需要对这个请求判断,确定是否可以处理
outRequest 传出请求,一般不做处理
outUserData 用户数据,将在整个过滤过程中投传

初始化方法

-(id _Nonnull)initWithRequest:(NSURLRequest *_Nonnull)request userData:(NSObject *_Nullable)userData;
参数名称 说明
request 传入请求
userData 用户数据,参考ff_canDoWithRequest的outUserData

请求

@property (nonatomic,strong,readonly,nonnull) NSURLRequest * request;

参考initWithRequest的request

用户数据

@property (nonatomic,strong,readonly,nullable) NSObject *userData;

参考initWithRequest的userData

接收网络数据

-(void)ff_URLSession:(NSURLSession *_Nonnull)session dataTask:(NSURLSessionDataTask *_Nonnull)dataTask didReceiveData:(NSData *_Nonnull)data;
参数名称 说明
session 请求回话
dataTask 数据任务
data 接收的数据

网络请求完成

-(void)ff_URLSession:(NSURLSession *_Nonnull)session task:(NSURLSessionTask *_Nonnull)task didCompleteWithError:(NSError *_Nullable)error;
参数名称 说明
session 请求回话
dataTask 数据任务
error 错误

获取本地数据

-(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;

如果本地数据处理成功,则不过发起网络请求;这个方法可能会被多次调用,直到数据读取完毕。数据读取完毕的判断条件是outTotal < inSize

参数名称 说明
inOffset 期望读取偏移
inSize 期望读取大小
outData 读取出来的数据
outTotal 读取出来的数据的大小
outErr 错误

本地文件路径

-(NSString *_Nonnull)localFilePath;

如果确定过滤器可以处理请求,且本地有缓存文件,需要在这个方法里返回本地文件路径。

清除本地文件

+(void)clearLocalFiles;

清除本地文件

+(void)clearLocalFiles;

获取响应数据缓存

-(nullable NSURLResponse *)ff_GetLocalResponse;

FireflyWebImageCacheFilter(图片缓存)

是FireflySessionURLCustomFilter的子类,重写的方法

+(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 @"具体文件的本地路径';
}

-(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
修订时间: 2019-08-02 16:19:33

results matching ""

    No results matching ""