更快分配网络响应
Assign network response sooner
我正在开发一个依赖网络服务后端的应用程序。我有一个单独的 class API
来处理所有网络活动并将数据发送到相关的视图控制器。
我有一个 NSURLSession.dataTaskWithRequest()
,它通过 POST 将我的数据发送到我的 API 和 returns 一个响应。我认为最好在我的 API class 中使用一个变量 networkResponse
以及 getter 和 setter,因为我只需要一个响应一次。
在我的 ViewController 中,我有一个登录表单,它向 API 发出请求并根据响应让用户登录。如果凭据不正确,它 returns UIAlertController 中的响应。
在测试不正确的凭据时,我发现没有及时为 AlertController 调用响应,因此它只显示一条空白消息。如果我关闭它并立即再次单击登录,它会显示响应。我将如何让它更快地显示出来?
登录函数:
class func login (username: String, password: String) {
config.HTTPAdditionalHeaders = ["Authorization" : authorization]
let url : NSURL = NSURL(string: "\(root)PHP/login.php")!
let request = NSMutableURLRequest(URL: url)
var returnString : NSString = ""
request.HTTPMethod = "POST"
let postString = "username=\(username)&password=\(password)"
request.HTTPBody = postString.dataUsingEncoding(NSUTF8StringEncoding)
var networkTask = mySession.dataTaskWithRequest(request) {
data, response, error in
var err : NSError?
dispatch_async(dispatch_get_main_queue()) {
/* Setting response variable here */
self.setNetworkResponse(NSString(data: data, encoding: NSUTF8StringEncoding)!)
}
}
networkTask.resume()
}
呼叫 API:
@IBAction func login(sender: AnyObject) {
if !txtUsername.text.isEmpty || !txtPassword.text.isEmpty {
API.login(txtUsername.text, password: txtPassword.text)
警报:
override func shouldPerformSegueWithIdentifier(identifier: String?, sender: AnyObject?) -> Bool {
if identifier == "segueLogin" {
if API.getNetworkResponse() !== "true" {
var alert = UIAlertController(title: "Message", message: API.getNetworkResponse() as String, preferredStyle: .Alert)
虽然这可能不是最理想的解决方案,但我设法通过设置延迟来解决问题,使用 shouldPerformSegueWithIdentifier
中的 dispatch_after
将警报延迟大约 5 秒。该消息现在第一次出现,这正是我要找的。
我正在开发一个依赖网络服务后端的应用程序。我有一个单独的 class API
来处理所有网络活动并将数据发送到相关的视图控制器。
我有一个 NSURLSession.dataTaskWithRequest()
,它通过 POST 将我的数据发送到我的 API 和 returns 一个响应。我认为最好在我的 API class 中使用一个变量 networkResponse
以及 getter 和 setter,因为我只需要一个响应一次。
在我的 ViewController 中,我有一个登录表单,它向 API 发出请求并根据响应让用户登录。如果凭据不正确,它 returns UIAlertController 中的响应。
在测试不正确的凭据时,我发现没有及时为 AlertController 调用响应,因此它只显示一条空白消息。如果我关闭它并立即再次单击登录,它会显示响应。我将如何让它更快地显示出来?
登录函数:
class func login (username: String, password: String) {
config.HTTPAdditionalHeaders = ["Authorization" : authorization]
let url : NSURL = NSURL(string: "\(root)PHP/login.php")!
let request = NSMutableURLRequest(URL: url)
var returnString : NSString = ""
request.HTTPMethod = "POST"
let postString = "username=\(username)&password=\(password)"
request.HTTPBody = postString.dataUsingEncoding(NSUTF8StringEncoding)
var networkTask = mySession.dataTaskWithRequest(request) {
data, response, error in
var err : NSError?
dispatch_async(dispatch_get_main_queue()) {
/* Setting response variable here */
self.setNetworkResponse(NSString(data: data, encoding: NSUTF8StringEncoding)!)
}
}
networkTask.resume()
}
呼叫 API:
@IBAction func login(sender: AnyObject) {
if !txtUsername.text.isEmpty || !txtPassword.text.isEmpty {
API.login(txtUsername.text, password: txtPassword.text)
警报:
override func shouldPerformSegueWithIdentifier(identifier: String?, sender: AnyObject?) -> Bool {
if identifier == "segueLogin" {
if API.getNetworkResponse() !== "true" {
var alert = UIAlertController(title: "Message", message: API.getNetworkResponse() as String, preferredStyle: .Alert)
虽然这可能不是最理想的解决方案,但我设法通过设置延迟来解决问题,使用 shouldPerformSegueWithIdentifier
中的 dispatch_after
将警报延迟大约 5 秒。该消息现在第一次出现,这正是我要找的。