Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios URLSession的Swift操作队列_Ios_Swift_Nsoperationqueue - Fatal编程技术网

Ios URLSession的Swift操作队列

Ios URLSession的Swift操作队列,ios,swift,nsoperationqueue,Ios,Swift,Nsoperationqueue,我是一名Android开发者,目前正在学习Swift。你能帮我处理一下手术队列吗 class ViewController: UIViewController { var movieArray :[Movie] = [] override func viewDidLoad() { super.viewDidLoad() let queue = OperationQueue() queue.maxConcurrentOper

我是一名Android开发者,目前正在学习Swift。你能帮我处理一下手术队列吗

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-End-Finish

您需要一个异步
操作
,如中所述

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


注:

如果存在本机对应项,则不要在Swift中使用
NS…

  • NSURL
    → <代码>URL
  • NSDictionary
    → <代码>[字符串:任意]
  • NSArray
    → <代码>[[String:Any]]

不要使用具有特殊功能的
value(forKey
。使用key subscription
dict[“key”]
对象(forKey
。如果预期类型是集合类型,则Swift中的
.allowFragments
读取选项毫无意义。请忽略该参数。

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

开始-完成-结束的顺序无论如何都不会发生。
由于异步行为,一个数据任务的顺序总是
Start-End-Finish

您需要一个异步
操作
,如中所述

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


注:

如果存在本机对应项,则不要在Swift中使用
NS…

  • NSURL
    → <代码>URL
  • NSDictionary
    → <代码>[字符串:任意]
  • NSArray
    → <代码>[[String:Any]]

不要使用具有特殊功能的
value(forKey
。使用key subscription
dict[“key”]
对象(forKey
。如果所需类型是集合类型,则Swift中的
.allowFragments
读取选项毫无意义。请忽略该参数。

您应该查看以下文档中的管理依赖项部分,了解您的解决方案: 或

参考此线程


或者,您必须制定逻辑,在调用第一个操作的finish/fail时,您应该将新操作添加到队列中,并从任务堆栈中减少任务。

您应该查看以下文档中的管理依赖项部分,以了解您的解决方案: 或

参考此线程


或者,您必须制定逻辑,在调用第一个操作的finish/fail时,您应该将新操作添加到队列中,并从任务堆栈中减少任务。

您需要为特定操作对类操作进行子类化,并重写主函数您需要为特定操作对类操作进行子类化,并重写e主要功能