【问题标题】:Swift OperationQueue for URLSessionURLSession 的 Swift OperationQueue
【发布时间】:2019-11-07 01:09:14
【问题描述】:

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

它们不是连续的,我怎样才能使它们如此呢?

【问题讨论】:

  • 您需要为您的特定操作子类化操作类,并覆盖主函数

标签: ios swift nsoperationqueue


【解决方案1】:

虽然操作是按顺序添加的,但不能保证它们以相同的顺序完成,因为 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 中毫无意义。省略参数。

【讨论】:

    【解决方案2】:

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

    参考这个话题 NSOperationQueue serial FIFO queue

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-04-05
      • 1970-01-01
      • 2017-06-22
      • 2017-04-10
      • 2017-01-30
      • 1970-01-01
      • 1970-01-01
      • 2021-04-09
      相关资源
      最近更新 更多