它由一个底层的URLSessionDataTask和一个TaskCallback数组组成。可以为单个下载数据任务可以添加多个TaskCallback。
/// 任务的回调
struct TaskCallback {
let onprogress: Delegate<(Int64, Int64), Void>?
let onCompleted: Delegate<Result<ImageLoadingResult, KingfisherError>, Void>?
let options: KingfisherParedOptionsInfo
}
TaskCallback中在完成时的回调封装了ImageLoadingResult
/// 反映了一个图片下载过程的成功的结果 一个结构体
public struct ImageLoadingResult {
public let image: Image
public let url: URL?
public let originalData: Data
}
其中每一个TaskCallback对象都有一个对应的CancelToken每添加一个taskCallback都会有canceltoken就会加1;以字典形式存储在callbacksStore。到时候以cancelToken来移除对应的TaskCallback
private var callbacksStore = [CancelToken: TaskCallback]()
func addCallback(_ callback: TaskCallback) -> CancelToken {
lock.lock()
defer {
lock.unlock()
}
callbacksStore[currentToken] = callback
defer {
currentToken += 1
}
return currentToken
}
我们再看看初始化方法其中,
1.把自己的task 属性赋值
2.初始化一个空的data
init(task: URLSessionDataTask) {
self.task = task
mutableData = Data()
}
里面的metableData就是你下载的data到时候用来转图片。
func didReceiveData(_ data: Data) {
mutableData.append(data)
}
SessionDataTask内部方法启动task,并不是在外部启动的;
把自己属性started标记为true
/// 启动URLSessionDataTask
func resume() {
guard !started else { return }
started = true
task.resume()
}
SessionDataTask的task取消
func cancel(token: CancelToken) {
guard let callback = removeCallback(token) else {
return
}
if callbacksStore.count == 0 {
task.cancel()
}
onCallbackCancelled.call((token, callback))
}
网友评论