多个网络请求后, 用 OperationQueue 回调,BlockOperation创建operation 只能是单线程,但是网络请求大部分情况都是多线程的,怎么办呢?
思路:创建Operation 的子类 NetworkOperation,重写 判断是否请求结束。
-
Operation 简单示例
public var queue: OperationQueue
self.queue = OperationQueue()
for i in 0...3 {
let rquestOperatio = BlockOperation {
print(" 内 rquestOperatio , i = ", i)
sleep(6)
}
self.queue.addOperation(rquestOperatio)
}
/// 当queue中的所有任务执行完后,会调用
self.queue.addBarrierBlock {
print("执行结束")
}
输出结果
内 rquestOperatio , i = 1
内 rquestOperatio , i = 2
内 rquestOperatio , i = 0
内 rquestOperatio , i = 3
执行结束
-
异步网络请求示例
1.自定义 operation (NetworkOperation.swift)
//
// NetworkOperation.swift
// LZTest
//
// Created by LiZhi on 2023/7/26.
//
import Foundation
import Alamofire
class NetworkOperation: Operation {
var url:String?
var parentItem:CModel?
var _isExecuting = false
var _isFinished = false
var operationCompletionBlock: ((AFDataResponse<Data?>) -> Void)?
override var isConcurrent: Bool {//并发
return true
}
override var isExecuting: Bool {//正在进行
return _isExecuting
}
override var isFinished: Bool{//已完成
return _isFinished
}
init(url: String? = nil, parentItem: CModel? = nil, operationCompletionBlock: ( (AFDataResponse<Data?>) -> Void)? = nil) {
self.url = url
self.parentItem = parentItem
self.operationCompletionBlock = operationCompletionBlock
super.init()
}
/// 不要调用父类的start
override func start() {
if let url = self.url {
AF.request(url).response { response in
print("request response")
self.operationCompletionBlock?(response);
self.setExecuting(isNewExecuting: false)
self.setFinished(isNewFinished: true)
}
}else {
self.setExecuting(isNewExecuting: false)
self.setFinished(isNewFinished: true)
}
}
func setExecuting(isNewExecuting:Bool) {
self.willChangeValue(forKey: "isExecuting")
_isExecuting = isNewExecuting
self.didChangeValue(forKey: "isExecuting")
}
func setFinished(isNewFinished:Bool) {
self.willChangeValue(forKey: "isFinished")
_isFinished = isNewFinished
self.didChangeValue(forKey: "isFinished")
}
}
2.调用 view controller
self.queue = OperationQueue()
let url1 = "XXXXX"
let newOperation1 = NetworkOperation(url: url1,parentItem: item) { response in
print("请求结束 1")
}
self.queue.addOperation(newOperation1)
let url2 = "XXXXX"
let newOperation2 = NetworkOperation(url: url2,parentItem: item) { response in
print("请求结束 2")
}
self.queue.addOperation(newOperation2)
/// 当queue中的所有任务执行完后,会调用
self.queue.addBarrierBlock {
print("执行结束")
}
完成 DONE !!!