繁体   English   中英

用于URLSession的Swift OperationQueue

[英]Swift OperationQueue for URLSession

我是一名正在学习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

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

尽管操作是按顺序添加的,但是由于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中是没有意义的。请省略该参数。

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

请参阅此线程NSOperationQueue串行FIFO队列

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM