拨打网络电话的最佳地点

时间:2016-10-24 11:14:03

标签: ios swift uiviewcontroller lifecycle

网络电话: -

   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 Lifecycle有点如下: -

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

但是,即使在查看视图后,用户信息也需要几秒钟才能在这些文本字段中显示。我认为viewDidLoad是进行网络呼叫的最佳场所。

我知道网络调用是异步的,因此需要时间从网络获取所需的数据并做出响应。但是,网络调用是在viewDidLoad中进行的,所以当时间视图出现时,它应该已经有了所需的数据?它不应该吗?

那么有人可以解释一下,哪个是拨打网络电话的最佳地点,为什么?我希望只要视图显示,就会使用用户信息更新文本字段。

2 个答案:

答案 0 :(得分:2)

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

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

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

viewDidLoad很棘手。

如果您认为viewDidLoad可以保护您多次从服务器获取数据:有时它会,有时它会赢。无论如何,它不是优化网络的正确工具,缓存是!

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

<强>更新

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

答案 1 :(得分:1)

我认为viewDidLoad是网络调用的正确位置,如果它符合该屏幕的需要。即,您不必在某个时刻重新请求数据。例如,如果自加载视图后配置文件数据已更改。

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

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