ios swift 多网络请求 request Operation OperationQueue ,Alamofire+Operation并用

138 阅读1分钟

多个网络请求后, 用 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 , i1

内 rquestOperatio , i2

内 rquestOperatio , i0

内 rquestOperatio , i3

执行结束
  • 异步网络请求示例
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? = niloperationCompletionBlock: ( (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 !!!