用于URLSession的Swift OperationQueue

时间:2019-06-25 08:34:37

标签: ios swift nsoperationqueue

我是一名正在学习Swift的Android开发人员。您能帮我使用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

它们不是顺序的,我该怎么做?

2 个答案:

答案 0 :(得分:2)

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

Start - Finish - End的顺序将永远不会发生。
由于异步行为,一个数据任务的顺序始终为Start - End – Finish

您需要在this answer中描述的异步Operation

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


注意:

如果有本机副本,请不要在Swift中使用NS...

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

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

答案 1 :(得分:0)

您应该查看以下文档中的管理依赖项部分以找到解决方案: https://developer.apple.com/documentation/foundation/operation

引用此线程 NSOperationQueue serial FIFO queue

您要么必须做出逻辑,即当调用第一个操作的完成/失败时,您应该将新操作添加到队列中,并减少任务堆栈中的任务。