自定義Operation子類:

Operation操作狀態(tài).png
代碼實(shí)現(xiàn):
private final class ImageDownloadOperation: Operation {
let url: URL
init(url: URL) {
self.url = url
}
internal var _executing = false {
willSet {
willChangeValue(forKey: "isExecuting")
}
didSet {
didChangeValue(forKey: "isExecting")
}
}
override var isExecuting: Bool {
return _executing
}
internal var _finished = false {
willSet {
willChangeValue(forKey: "isFinished")
}
didSet {
didChangeValue(forKey: "isFinished")
}
}
public override var isFinished: Bool {
return _finished
}
override func start() {
_executing = true
URLSession.shared.dataTask(with: url) { [weak self] (data, response, error) in
guard let welf = self else { return }
guard !welf.isCancelled else {
welf._executing = false
welf._finished = true
return
}
guard let data = data, let httpResponse = response as? HTTPURLResponse, error == nil else {
welf._executing = false
welf._finished = true
return
}
guard httpResponse.statusCode == 200 else {
welf._executing = false
welf._finished = true
return
}
guard !welf.isCancelled else {
welf._executing = false
welf._finished = true
return
}
//完成下載
DispatchQueue.main.async {
}
//處理緩存
welf._executing = false
welf._finished = true
}.resume()
}
}
定義_executing,_finished的原因是因?yàn)樗鼈冎挥袑?yīng)的get方法:

Operation.png
參考資料