[英]Swift iOS -DispatchGroup with URLSession is locking other parts of app that it is not located in
[英]iOS - swift 3 - DispatchGroup
我创建了这种基本架构来处理我的网络事务,
我想保持模块化和结构化:
public class NetworkManager {
public private(set) var queue: DispatchQueue = DispatchQueue(label: "com.example.app.dispatchgroups", attributes: .concurrent, target: .main)
public private(set) var dispatchGroup: DispatchGroup = DispatchGroup()
private static var sharedNetworkManager: NetworkManager = {
let networkManager = NetworkManager()
return networkManager
}()
private init() {}
class func shared() -> NetworkManager {
return sharedNetworkManager
}
public func getData() {
dispatchGroup.enter()
queue.async(group: dispatchGroup) {
Alamofire.request(Content.url).responseJSON { response in
switch response.result {
case .success(let value):
let json = JSON(value)
// do some stuff and save to Content struct
Content.annotations += [Station(...)]
case .failure(let error):
print("error: ",error)
}
}
self.dispatchGroup.leave()
}
}
}
struct Content {
static var url = "url"
static var annotations = [Station]()
}
因此,当我在单独的班级中调用此命令时:
class MainViewController {
override func viewDidLoad() {
super.viewDidLoad()
// some stuff ...
NetworkManager.shared().getData()
NetworkManager.shared().dispatchGroup.notify(queue: DispatchQueue.main) {
self.mapView.removeAnnotations(Content.annotations)
self.mapView.addAnnotations(Content.annotations)
}
}
}
Buuut,似乎DispatchGroup()。notify()在所有请求完成之前就已执行...因为没有将注释添加到mapview。
我已经检查过并加载了注释。
有人可以帮我这个架构吗?
谢谢和问候!
我认为您需要将self.dispatchGroup.leave()
放入Alamofire
响应处理程序中。 按照书面规定,您将请求排队后就离开。
queue.async(group: dispatchGroup) {
Alamofire.request(Content.url).responseJSON { response in
switch response.result {
case .success(let value):
let json = JSON(value)
// do some stuff and save to Content struct
Content.annotations += [Station(...)]
case .failure(let error):
print("error: ",error)
}
self.dispatchGroup.leave()
}
}
如下所示更改代码。
public func getData() {
dispatchGroup.enter()
queue.async(group: dispatchGroup) {
Alamofire.request(Content.url).responseJSON { response in
switch response.result {
case .success(let value):
let json = JSON(value)
// do some stuff and save to Content struct
Content.annotations += [Station(...)]
case .failure(let error):
print("error: ",error)
}
self.dispatchGroup.leave() // This statement has been moved
}
}
}
错误是您在输入DispatchGroup之后不久就离开了。 如果必须等待网络操作完成,则应从响应处理程序中退出。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.