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