网络通话:-
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中进行的,因此在显示视图时,它应该已经具有必需的数据了?不应该吗?
所以有人可以向我解释哪个是拨打网络电话的最佳地点,为什么?我希望在视图出现时立即用用户信息更新文本字段。
需要在viewWillAppear:
中触发请求,只有此方法通知您即将显示该屏幕。如果您不想每次显示屏幕时都发送请求,请考虑在拥有数据后将其缓存。
viewDidLoad
不是最佳候选人。它与屏幕的外观无关。在第一次请求视图控制器的视图后立即调用它,而不是在屏幕显示时调用。
例如,如果屏幕被破坏(通过从导航控制器弹出),则再次显示时(通过将屏幕推向导航控制器,您会收到viewDidLoad
。或者,如果应用程序收到内存警告,则将卸载并重新加载当前视图,最终发送视图控制器viewDidLoad
。
viewDidLoad
很棘手。
[如果您认为viewDidLoad
将使您免于多次从服务器获取数据的麻烦:有时会,有时不会。无论如何,这不是优化网络的正确工具,缓存是!
由于远程请求很昂贵(它们花费时间和流量),因此您想了解它们何时发送。 viewWillAppear:
使您理解。结合缓存,可以使其达到最佳状态。
UPDATE
在大多数情况下,直接从视图控制器发送请求不是一个好主意。我建议创建一个单独的网络层。
我认为viewDidLoad是适合该屏幕需要的进行网络呼叫的正确位置。也就是说,您不必在某个时候重新请求数据。例如,如果自加载视图以来概要文件数据已更改。
关于网络请求需要花费时间,您的视图可能会在网络请求完成之前出现。我建议添加一些在请求完成后隐藏的加载指示器。
此外,请记住,网络请求可能会失败,因此您应通过重试请求或显示错误消息来解决。