美文网首页
Kingfisher源码之SessionDataTask

Kingfisher源码之SessionDataTask

作者: Mannyao | 来源:发表于2020-08-24 10:52 被阅读0次

它由一个底层的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))
    }

相关文章

网友评论

      本文标题:Kingfisher源码之SessionDataTask

      本文链接:https://www.haomeiwen.com/subject/tcggjktx.html