Swift URLSession 的操作队列

Swift OperationQueue for URLSession

我是一名 Android 开发人员,目前正在学习 Swift。你能帮我处理 OperationQueue 吗?

class ViewController: UIViewController {

     var movieArray :[Movie] = []

    override func viewDidLoad() {
        super.viewDidLoad()

        let queue = OperationQueue()

        queue.maxConcurrentOperationCount = 1

        for index in 1...5
        {
            queue.addOperation {
            self.process(value: index)
            }
        }

    }

    func process(value:Int)
    {
        print("Start for: \(value)")

        let url = NSURL(string: URL_API+"\(value)")

        //fetching the data from the url
        URLSession.shared.dataTask(with: (url as URL?)!, completionHandler: {(data, response, error) -> Void in

            if let jsonObj = try? JSONSerialization.jsonObject(with: data!, options: .allowFragments) as? NSDictionary
            {

                if let resultArray = jsonObj.value(forKey: "results") as? NSArray
                {
                    //Some Code...

                }

                print("Finish for: \(value)")
            }
        }).resume()

        print("End for: \(value)")
    }

}

我期望得到的是:

Start for: 1
Finish for: 1
End for: 1
Start for: 2
End for: 2
Finish for: 2
Start for: 3
Finish for: 3
End for: 3
Start for: 4
Finish for: 4
End for: 4
Start for: 5
Finish for: 5
End for: 5

我得到的是:

Start for: 1
End for: 1
Start for: 2
End for: 2
Start for: 3
End for: 3
Start for: 4
End for: 4
Start for: 5
End for: 5
Finish for: 1
Finish for: 5
Finish for: 3
Finish for: 4
Finish for: 2

它们不是顺序的,我怎样才能使它们如此?

尽管操作是按顺序添加的,但不能保证它们会以相同的顺序完成,因为 dataTask 异步工作。

订单Start - Finish - End无论如何都不会发生。
由于异步行为,一个数据任务的顺序总是 Start - End – Finish.

您需要

中描述的异步 Operation

在数据任务的完成块中异步Operation调用finish()


注:

如果有本地对应项,请不要在 Swift 中使用 NS...

  • NSURLURL
  • NSDictionary[String:Any]
  • NSArray[[String:Any]]

并且不要 value(forKey 具有特殊功能。使用密钥订阅 dict["key"]object(forKey。如果预期类型是集合类型,则 .allowFragments 读取选项在 Swift 中毫无意义。省略参数。

您应该查看以下文档中的 Managing Dependencies 部分以获得您的解决方案: https://developer.apple.com/documentation/foundation/operation

引用此线程 NSOperationQueue serial FIFO queue

要么你必须制定逻辑,当你的第一个操作 finish/fail 被调用时,你应该将新操作添加到队列中并从任务堆栈中减少任务。