首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Swift OperationQueue for URLSession

Swift OperationQueue for URLSession
EN

Stack Overflow用户
提问于 2019-06-25 08:34:37
回答 2查看 1.7K关注 0票数 1

我是一个Android开发人员,目前正在学习Swift。你能帮我拿一下OperationQueue吗?

代码语言:javascript
运行
复制
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)")
    }

}

我想得到的是:

代码语言:javascript
运行
复制
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

我得到的是:

代码语言:javascript
运行
复制
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

它们不是连续的,我怎么能让它们这样呢?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-06-25 08:48:55

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

无论如何,Start - Finish - End订单永远不会发生。

由于异步行为,一个数据任务的顺序总是Start - End – Finish

您需要一个用Operation描述的异步this answer

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

注意:

如果存在本机对应程序,则不要在Swift中使用NS...

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

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

票数 2
EN

Stack Overflow用户

发布于 2019-06-25 09:10:41

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

引用这个线程NSOperationQueue serial FIFO queue

要么您必须建立逻辑,当您的第一个操作的finish/fail被调用时,您应该添加新的操作来排队并减少任务堆栈中的任务。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56749911

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档