首页 > 解决方案 > URLSession 的 Swift OperationQueue

问题描述

我是一名 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

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

标签: iosswiftnsoperationqueue

解决方案


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

无论如何,命令Start - Finish - End永远不会发生。
由于异步行为,一个数据任务的顺序始终是Start - End – Finish

您需要此答案Operation中描述的异步

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


笔记:

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

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

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


推荐阅读