我是一个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它们不是连续的,我怎么能让它们这样呢?
发布于 2019-06-25 08:48:55
尽管这些操作是按顺序添加的,但不能保证它们以相同的顺序完成,因为dataTask异步工作。
无论如何,Start - Finish - End订单永远不会发生。
由于异步行为,一个数据任务的顺序总是Start - End – Finish。
您需要一个用Operation描述的异步this answer
在异步Operation中,在数据任务的完成块中调用finish()。
注意:
如果存在本机对应程序,则不要在Swift中使用NS...类
NSURL→URLNSDictionary→[String:Any]NSArray→[[String:Any]]不要使用具有特殊功能的value(forKey。使用键订阅dict["key"]或object(forKey。如果期望的类型是集合类型,那么.allowFragments读取选项在Swift中是没有意义的。省略参数。
发布于 2019-06-25 09:10:41
您应该查看解决方案的以下文档中的管理依赖项部分:https://developer.apple.com/documentation/foundation/operation或
引用这个线程NSOperationQueue serial FIFO queue
要么您必须建立逻辑,当您的第一个操作的finish/fail被调用时,您应该添加新的操作来排队并减少任务堆栈中的任务。
https://stackoverflow.com/questions/56749911
复制相似问题