[英]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...
类
NSURL
→ URL
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.