Skip to content
norld edited this page Jun 11, 2020 · 7 revisions

FKConfigure


配置类, 负责配置下载中所需要的参数, 最好在应用启动后立即配置.

配置 FKDownloader 的工作目录, 下载中途生成的文件都将在此目录中放置, 默认为 Library/Caches/com.fk.downloader.work/ 文件夹. 下载中途修改将产生不可预料的后果, 请在下载前进行配置

[FKConfigure configure].workPath = @"Custom Path";

配置最大下载数量, 默认 3, 设定范围 1 ~ 6

[FKConfigure configure].maxAction = 3;

配置信息分发速率, 默认 5 倍, 最小 1 倍, 最大 10 倍, 1 倍为 0.2 秒

[FKConfigure configure].distributeSpeed = 5;

配置 NSURLSessionConfiguration, 包含 Background SessionForeground Session. 鉴于系统类中包含了新的特性, 所以配置相关都在一个模版上进行配置, FKDownloader 会以此模版进行配置 Session, 其中 allowsCellularAccess 为默认开启

[FKConfigure configure].templateBackgroundConfiguration.allowsCellularAccess = NO;
[FKConfigure configure].templateForegroundConfiguration.allowsCellularAccess = NO;

配置后台下载的系统回调, 此方法在 -[AppDelegate application:handleEventsForBackgroundURLSession:completionHandler] 中使用

- (void)application:(UIApplication *)application handleEventsForBackgroundURLSession:(NSString *)identifier completionHandler:(void (^)(void))completionHandler {
    if ([identifier isEqualToString:[FKConfigure configure].backgroundSessionIdentifier]) {
        [FKConfigure configure].completionHandler = completionHandler;
    }
}

配置完成后, 使配置生效

[[FKConfigure configure] takeSession];

FKDownloader 采用计时器执行轮询执行任务, 间隔 1s, 默认情况下, 该计时器不会激活, 需要显式激活后才可进行任务

[[FKConfigure configure] activateQueue];

FKBuilder


构建者主要负责创建任务, 设定任务的基本信息等.

使用链接进行构建, 注意, 如果链接不合法, 将会返回 nil

FKBuilder *builder = [FKBuilder buildWithURL:@"Download URL"];

配置下载类型, 支持前台下载和后台下载, 默认为后台下载

builder.downloadType = FKDownloadBackground;

对下载链接进行预处理, 这一步主要流程为:

  1. 创建下载任务对应的文件夹与信息描述文件
  2. 生成内部使用的唯一任务编号
  3. 将任务放入内部缓存

在此流程中, 任务状态为 FKStatePrepare, 即处理中

[builder prepare];

FKDownloader 的每一个任务都对应一个本地信息文件, 当 App 因为重启等原因丢失内存缓存时, 一些信息获取逻辑会在控制台提示任务不存在等信息, 这时就需要手动执行上述流程, 使任务信息加载到内存中. 该场景可在 Demo 中下载信息列表界面中, 每个 Cell 赋值 URL 时看到.

FKControl


主要负责控制任务状态

激活任务, 对 FKStateCancel 和 FKStateError 状态生效, 将任务重新排到任务队列中

[FKControl actionRequestWithURL:@"Download URL"];

暂停任务, 对 FKStateAction 和 FKStateIdel 状态生效

[FKControl suspendRequestWithURL:@"Download URL"];

也可执行 +[FKControl suspendAllTask] 暂停所有任务

继续任务, 对 FKStateSuspend 状态生效
对于前台任务, 重启 App 后, 状态会重置为暂停, 执行继续将重新下载

[FKControl resumeRequestWithURL:@"Download URL"];

也可执行 +[FKControl resumeAllTask] 继续下载所有已暂停任务

取消任务, 对 FKStateAction, FKStateSuspend, FKStateIdel 和 FKStateError 状态生效

[FKControl cancelRequestWithURL:@"Download URL"];

取消所有请求, 会对 Background Session 所有的, 状态为 NSURLSessionTaskStateRunning 的 Download Task 进行取消操作

[FKControl cancelAllRequest];

删除任务所有文件, 可视作彻底移除任务, 但最好在任务已完成, 或已取消的状态下执行, 其他状态可能会出现意外情况.

[FKControl trashRequestWithURL:@"Download URL"];

FKMessager


负责获取任务对应的信息

检查 URL 对应的任务是否存在, 将会在下载列表和磁盘缓存中查找

BOOL isExist = [FKMessager existWithURL:@"URL"];

获取下载链接对应任务信息, 会跟随信息分发计时器不断调用, 如果只想在状态改变时获取, 或只想或进度信息, 见 FKMiddleware.

注意, 回调不在主线程, 如需 UI 操作请自行切换线程

[FKMessager messagerWithURL:@"Download URL" info:^(int64_t countOfBytesReceived,
                                                   int64_t countOfBytesPreviousReceived,
                                                   int64_t countOfBytesExpectedToReceive,
                                                   FKState state,
                                                   NSError * _Nullable error) {
        
    // do something...
}];

只获取一次任务信息, 回调不在主线程

[FKMessager acqireMessagerInfo:@"Download URL" info:^(int64_t countOfBytesReceived,
                                                      int64_t countOfBytesPreviousReceived,
                                                      int64_t countOfBytesExpectedToReceive,
                                                      FKState state,
                                                      NSError * _Nullable error) {
        
    // do something...
}];

将多个链接标记为一个任务集合

// Add
[FKMessager addMessagerWithURLs:@[@"Download URL"] barrel:@"name"];

// Delete
[FKMessager removeMessagerBarrel:@"name"];

对任务集合进行管理

// Add URL
[FKMessager addURL:@"Download URL" fromBarrel:@"name"];

// Delete URL
[FKMessager removeURL:@"Download URL" fromBarrel:@"name"];

也可使用 +[FKMessager acquireURLsWithBarrel:] 获取集合内所有的 URL

获取一个集合的任务信息, 基本上, 集合信息只是最基本的数据, 只有总大小, 上次已下载大小和已下载大小, 状态之类的数据请自行记录和控制

[FKMessager messagerWithBarrel:@"name" info:^(int64_t countOfBytesReceived, int64_t countOfBytesPreviousReceived, int64_t countOfBytesExpectedToReceive) {
    // do something...
}];

直接获取下载链接对应任务的状态

FKState state = [FKControl stateWithURL:@"Download URL"];

直接获取下载链接对应任务的错误信息, 可能为空值

NSError *error = [FKControl errorWithURL:@"Download URL"];

直接获取下载链接对应文件的路径, 文件可能不存在

NSString *path = [FKControl downloadedFilePathWithURL:@"Download URL"];

FKMiddleware


管理中间件, 包括请求中间件, 下载中间件和响应中间件

请求中间件

注册请求中间件, 在构建 NSMutableURLRequest 时, 会依次调用中间件来处理请求, FKDownloader 会使用最终的 NSMutableURLRequest 来进行下载

[[FKMiddleware shared] registeRequestMiddleware:[CustomRequestMiddleware new]];

请求中间件类需要遵循 FKRequestMiddlewareProtocol 协议, 并实现被标记为 @required 的方法与属性, 其中 priority 表示优先级, 类型为正整数, 值越接近 0, 优先级越高, 中间件协议带有 priority 属性的, 都与请求中间件逻辑一致.

在请求中间件中实现协议中的 -[FKMiddleware processRequest:] 方法来处理请求, 该方法会将 NSMutableURLRequest 作为参数传进来, 自定义处理后, 将 NSMutableURLRequest 返回即可

下载中间件

注册下载中间件, 在下载中进度改变时, 和任务状态改变时被调用

[[FKMiddleware shared] registeDownloadMiddleware:[CustomDownloadMiddleware new]];

下载中间件协议中的 -[FKMiddleware downloadURL:state:error:] 会在任务状态改变时被调用, 方法内部为子线程, UI 相关的操作请自行改变线程

-[FKMiddleware downloadURL:countOfBytesReceived:countOfBytesPreviousReceived:countOfBytesExpectedToReceive:] 会在下载进度改变时调用, 与系统下载信息改变同步, 方法内部为子线程, UI 相关的操作请自行改变线程

响应中间件

注册响应中间件, 在任务完成下载或出错中断后被调用, 可以用来处理文件校验, 移动文件到指定路径等操作.

[[FKMiddleware shared] registeResponseMiddleware:[CustomResponseMiddleware new]];

响应中间件协议中 -[FKMiddleware processResponse:] 方法会传进来一个 FKResponse 对象, 对象结构如下:

@interface FKResponse : NSObject

@property (nonatomic, strong) NSString *originalURL;
@property (nonatomic, strong) NSURLResponse *response;
@property (nonatomic, strong) NSString *filePath;
@property (nonatomic, strong, nullable) NSError *error;

@end

其中 originalURL 是在构建时传入的链接, response 为系统返回的请求响应信息, 可从中获取相应头的信息. filePath 为下载的文件路径, 下载请求完成后, 文件会移动到此路径, 注意, 文件可能不存在. error 为系统返回的请求响应错误, 可能为网络中断, 验证无法通过, 不合法的返回值等问题.

FKDownloadTool


便捷类, 针对简单下载封装, 更复杂的逻辑可使用上述类进行实现

添加并开始任务

[FKDownloadTool addURL:@"URL"];

获取任务所有信息, 同 +[FKMessager messagerWithURL:info:] 方法, 将会不停被调用, 回调不在主线程

[FKDownloadTool getInfoWithURL:@"URL" complete:^(int64_t countOfBytesReceived,
                                                 int64_t countOfBytesPreviousReceived,
                                                 int64_t countOfBytesExpectedToReceive,
                                                 FKState state,
                                                 NSError * _Nullable error) {
        
    // do something...
}];

暂停任务

[FKDownloadTool suspendWithURL:@"URL"];

暂停所有任务

[FKDownloadTool suspendAllTask];

恢复任务

[FKDownloadTool resumeWithURL:@"URL"];

恢复所有任务

[FKDownloadTool resumeAllTask];

取消并删除任务

[FKDownloadTool cancelWithURL:@"URL"];