首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使dataTaskWithRequest按时间顺序编排(Xcode 9,swift 4)?

如何使dataTaskWithRequest按时间顺序编排(Xcode 9,swift 4)?
EN

Stack Overflow用户
提问于 2018-06-26 08:52:51
回答 2查看 50关注 0票数 0

我有一个关于Xcode9 Swift 4的问题,我试图从某个api中获取一些数据,我需要使用这些数据来显示。但是,由于urlSession是高度异步的,所以我无法在正确的时间获得数据(大多数情况下数据为零)。这是密码。

代码语言:javascript
复制
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。

代码语言:javascript
复制
func configNavigationBar(){
    getUserInfo()
    if dataTask?.state == .completed{
    navigationItem.title = userInfo?.AccountName
    navigationItem.setHidesBackButton(true, animated: true)
    navigationController?.navigationBar.prefersLargeTitles = true
    }
}

有人能帮我解决这个问题吗?我非常感谢任何帮助。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-06-26 09:09:34

在成功的http请求之后更改标题如何?在回调中。在接收数据之前,您可以配置除标题之外的所有内容。

代码语言:javascript
复制
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更新包装到主线程中。

代码语言:javascript
复制
getUserInfo { accountName in
    DispatchQueue.main.async {
        self.navigationItem.title = accountName
    }
}
票数 1
EN

Stack Overflow用户

发布于 2018-06-26 09:02:25

您只需等待直到您的数据已经下载。

当下载繁忙时,您应该决定在导航栏上显示临时状态。

然后,当下载完成(或失败)时,您将再次更新导航栏。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51038711

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档