网络通话:-
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(编码器aDecoder:NSCoder) -> viewDidLoad -> viewWillAppear -> viewWillDisappear
然而,即使在视图出现后,用户信息也需要几秒钟的时间才能显示在这些文本字段中。我认为 viewDidLoad 是进行网络调用的最佳场所。
我知道网络调用是异步的,因此需要时间从网络获取所需的数据并做出响应。但是,网络调用是在 viewDidLoad 中进行的,因此当视图出现时,它应该已经有了所需的数据?不应该吗?
那么谁能解释一下哪个是进行网络调用的最佳位置以及为什么?我希望在视图出现时立即使用用户信息更新文本字段。
请求需要在viewWillAppear:
,只有这个方法会通知您屏幕即将显示。如果您不想每次显示屏幕时都发送请求,请考虑在获得数据后缓存数据。
viewDidLoad
不是最佳人选。它与屏幕的外观无关。它在第一次请求视图控制器的视图后立即调用,而不是在屏幕显示时调用。
例如,如果屏幕被破坏(通过从导航控制器弹出),您将收到viewDidLoad
当您再次显示它时(通过将屏幕推到导航控制器)。或者,如果应用程序收到内存警告,则会卸载并再次加载当前视图,最终发送视图控制器viewDidLoad
.
viewDidLoad
很棘手。
如果你这么认为viewDidLoad
将使您免于多次从服务器获取数据:有时会,有时不会。不管怎样,它不是优化网络的正确工具,缓存才是!
由于远程请求的成本很高(它们需要时间和流量),因此您需要了解它们何时发送。viewWillAppear:
给你理解。结合缓存,您可以使其达到最佳状态。
UPDATE
在大多数情况下,直接从视图控制器发送请求并不是一个好主意。我建议创建一个单独的网络层。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)