ios - URLSession 的 Swift OperationQueue
问题描述
我是一名 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
它们不是顺序的,我怎样才能使它们如此?
解决方案
尽管操作是按顺序添加的,但不能保证它们以相同的顺序完成,因为它们是
dataTask
异步工作的。
无论如何,命令Start - Finish - End
永远不会发生。
由于异步行为,一个数据任务的顺序始终是Start - End – Finish
。
您需要此答案Operation
中描述的异步
在数据任务的完成块中进行异步Operation
调用finish()
。
笔记:
NS...
如果有本地对应物,请不要在 Swift 中使用类
NSURL
→URL
NSDictionary
→[String:Any]
NSArray
→[[String:Any]]
并且不value(forKey
具有特殊功能。使用密钥订阅dict["key"]
或object(forKey
. .allowFragments
如果预期的类型是集合类型,那么read 选项在 Swift 中毫无意义。省略参数。
推荐阅读
- angular - 如何禁用primeng p-table选择模式?
- laravel - Laravel:使用多列进行身份验证
- python - Pandas Dataframe:df 添加来自另一个 df1 数据框的列
- java - 如何在使用 Streams 时访问相应的内部列表项
- angular - 如何使用AngularFire2获取firebase中元素的键?
- bash - 注意在 bash while 循环中出现超时的日志行
- ajax - 在 Wordpress 中使用 ajax 更新 meta_key
- javascript - 如何检查对象上是否存在多个属性而不会过于冗长?
- html - 这段代码不会将 div 分成两列,我该如何实现?
- macos - VMware,macOS 应用程序在手动工作时无法写入 USB 笔式驱动器