我有一个关于Xcode9 Swift 4的问题,我试图从某个api中获取一些数据,我需要使用这些数据来显示。但是,由于urlSession是高度异步的,所以我无法在正确的时间获得数据(大多数情况下数据为零)。这是密码。
func getUserInfo(){
let data = user!.Data as? [String : Any] ?? nil
if let data = data{
let ID = data["ID"] as? Int ?? nil
if let ID = ID{
let jsonUrlString = "SomeString"
let requestUrl = URL(string: jsonUrlString)
var request = URLRequest(url: requestUrl!)
request.httpMethod = "GET"
request.setValue("SomeKey", forHTTPHeaderField: "AppKey")
request.setValue(md5("Someinfo"), forHTTPHeaderField: "Sign")
dataTask = URLSession.shared.dataTask(with: request){(data, response, err) in
guard let data = data, err == nil else { // check for fundamental networking err
print("error=\(String(describing: err))")
return
}
if let httpStatus = response as? HTTPURLResponse, httpStatus.statusCode != 200 {
// check for http errors
print("statusCode should be 200, but is \(httpStatus.statusCode)")
print("response = \(String(describing: response))")
}
do{
guard let json = try JSONSerialization.jsonObject(with: data, options: .mutableContainers) as? [Any] else{return}
var userInfo = userDetail(json: json)
let dataDic = userInfo.dataArray as? [String:Any] ?? nil
userInfo.ID = dataDic?["ID"] as? Int
userInfo.AccountName = dataDic?["AccountName"] as? String
userInfo.Avatar = dataDic?["Avatar"] as? String
} catch let jsonErr{
print(jsonErr)
}
}
dataTask?.resume()
}
}
}我将数据存储到变量userInfo中,它具有ID、帐户名和阿凡达等属性。但是,当我在另一个方法"configNavigationBar“中调用函数时,它不能为我初始化userInfo。
func configNavigationBar(){
getUserInfo()
if dataTask?.state == .completed{
navigationItem.title = userInfo?.AccountName
navigationItem.setHidesBackButton(true, animated: true)
navigationController?.navigationBar.prefersLargeTitles = true
}
}有人能帮我解决这个问题吗?我非常感谢任何帮助。
发布于 2018-06-26 09:09:34
在成功的http请求之后更改标题如何?在回调中。在接收数据之前,您可以配置除标题之外的所有内容。
func configNavigationBar(){
getUserInfo { accountName in
self.navigationItem.title = accountName
}
navigationItem.setHidesBackButton(true, animated: true)
navigationController?.navigationBar.prefersLargeTitles = true
}
func getUserInfo(_ callback: @escaping (String) -> Void) {
...
var userInfo = userDetail(json: json)
let dataDic = userInfo.dataArray as? [String:Any] ?? nil
userInfo.ID = dataDic?["ID"] as? Int
userInfo.AccountName = dataDic?["AccountName"] as? String
userInfo.Avatar = dataDic?["Avatar"] as? String
// here's the insertion
callback(userInfo.AccountName)
// end of insertion
....
}如果http请求使用后台线程,则还可能需要将ui更新包装到主线程中。
getUserInfo { accountName in
DispatchQueue.main.async {
self.navigationItem.title = accountName
}
}发布于 2018-06-26 09:02:25
您只需等待直到您的数据已经下载。
当下载繁忙时,您应该决定在导航栏上显示临时状态。
然后,当下载完成(或失败)时,您将再次更新导航栏。
https://stackoverflow.com/questions/51038711
复制相似问题