进行网络通话的最佳位置

问题描述 投票:4回答:2

网络通话:-

   static func getProfile(parameters:[String:AnyObject], onComplete:[String:AnyObject]->()) {

        var requiredData:[String:AnyObject] = [:]

        Alamofire.request(.GET,API.getProfile,parameters: parameters).validate().responseJSON { (response) in
            if let responseData = response.result.value {
                if let jsonData = responseData as? [String:AnyObject] {
                    requiredData["UserName"] = jsonData["UName"]
                    requiredData["UserEmail"] = jsonData["UEmail"]
                    requiredData["UserMobileNo"] = jsonData["UPhone"]
                    requiredData["UserAddress"] = jsonData["UAddress"]
                    requiredData["UserCity"] = jsonData["UCity"]
                }// Inner If

            } // Main if
            onComplete(requiredData)
        }// Alamofire Closed

    }// Func closed

所需的VC中的网络呼叫:-

 override func viewDidLoad() {
        super.viewDidLoad()
        let parameters:[String:AnyObject] = [
            "WebKey": API.WebKey.value.rawValue,
            "UId":NSUserDefaults.standardUserDefaults().integerForKey("UserId")
        ]
        NetworkInterface.getProfile(parameters) { (responseDictionary) in
            //print("Passed Data \(responseDictionary["UserName"])")
            self.userData = responseDictionary
            self.updateUI()
        }

    }

据我所知,VC生命周期如下:-

init(coder aDecoder:NSCoder)-> viewDidLoad-> viewWillAppear-> viewWillDisappear

但是,即使在显示视图之后,也要花几秒钟的时间在这些文本字段中显示用户信息。我认为viewDidLoad是拨打网络电话的最佳地点。

我了解网络调用是异步的,因此需要花费一些时间从网络中获取所需的数据并做出响应。但是,网络调用是在viewDidLoad中进行的,因此在显示视图时,它应该已经具有必需的数据了?不应该吗?

所以有人可以向我解释哪个是拨打网络电话的最佳地点,为什么?我希望在视图出现时立即用用户信息更新文本字段。

ios swift uiviewcontroller lifecycle
2个回答
3
投票

需要在viewWillAppear:中触发请求,只有此方法通知您即将显示该屏幕。如果您不想每次显示屏幕时都发送请求,请考虑在拥有数据后将其缓存。

viewDidLoad不是最佳候选人。它与屏幕的外观无关。在第一次请求视图控制器的视图后立即调用它,而不是在屏幕显示时调用。

例如,如果屏幕被破坏(通过从导航控制器弹出),则再次显示时(通过将屏幕推向导航控制器,您会收到viewDidLoad。或者,如果应用程序收到内存警告,则将卸载并重新加载当前视图,最终发送视图控制器viewDidLoad

viewDidLoad很棘手。

[如果您认为viewDidLoad将使您免于多次从服务器获取数据的麻烦:有时会,有时不会。无论如何,这不是优化网络的正确工具,缓存是!

由于远程请求很昂贵(它们花费时间和流量),因此您想了解它们何时发送。 viewWillAppear:使您理解。结合缓存,可以使其达到最佳状态。

UPDATE

在大多数情况下,直接从视图控制器发送请求不是一个好主意。我建议创建一个单独的网络层。


1
投票

我认为viewDidLoad是适合该屏幕需要的进行网络呼叫的正确位置。也就是说,您不必在某个时候重新请求数据。例如,如果自加载视图以来概要文件数据已更改。

关于网络请求需要花费时间,您的视图可能会在网络请求完成之前出现。我建议添加一些在请求完成后隐藏的加载指示器。

此外,请记住,网络请求可能会失败,因此您应通过重试请求或显示错误消息来解决。

© www.soinside.com 2019 - 2024. All rights reserved.