接口
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;
}
}