swift2.0,从 REST 调用返回信息(Alamofire)
swift2.0, returning information from REST calls (Alamofire)
各位,
试图了解通过进行外部 API 调用来 returning 数据的正确编程方法。
在我继续创建自己的 swift 代码重用框架(管理我的应用程序的所有其余 api 调用)之前,我想询问社区他们如何处理以下情况:
这里我们有一个在登录视图上点击的按钮,我们需要调用我们的身份验证服务,并对我们返回的内容做出反应。
viewController:
import myLib
@IBAction func loginButtonTapped(sender: AnyObject) {
let email = emailField.text!
let password = pwField.text!
let loginResult = myLib.login(email,password)
if (loginResult.success) {
NSUserDefaults.standardUserDefaults().setBool(true, forKey: "isUserLoggedIn")
NSUserDefaults.standardUserDefaults().synchronize()
self.dismissViewControllerAnimated(true, completion: nil)
} else {
displayAlertMessage(loginResult.message)
}
}
myLib.login:
import Foundation
import Alamofire
import SwiftyJSON
public func Login(email: String, password: String, completion: ((success: Bool, message: String?, token: String?) -> Void)) {
let parameters: [String: String] = [
"username" : email,
"password" : password
]
let endpoint = "https://api.foo.bar/login"
Alamofire.request(.POST, endpoint, parameters: parameters, encoding: .JSON)
.responseJSON { response in
guard response.result.error == nil else {
print(response.result.error!)
completion(success: false, message: "error calling POST on /account/login", token: nil)
return
}
if let value = response.result.value {
let apiResponseJSONBody = JSON(value)
completion(success: true, message: nil, token: apiResponseJSONBody["token"].string)
}
}
}
- 将结果作为结构传回是否正确?我注意到我们必须创建结构 public 才能 return 它。
谢谢!我非常感谢所有反馈。
更新:相关问题已发布:Swift Alamofire + Promise catching
您不能使用 Login
方法的 return 值,因为请求是异步的。
基本上,您的 Login
方法将始终 return 立即 success = false
。
到return异步,需要在Login
添加完成块:
public func Login(email: String, password: String, completion: (success: Bool, message: String?, token: String?) -> Void) {
...
}
然后,当您收到来自 Alamofire 的响应时,像这样调用您的完成块:
completion(success: false, message: nil, token: nil)
在您的视图控制器中,您可以像这样使用 Login
:
myLib.Login(email, password) { success, message, token in
if success {
...
}
}
各位, 试图了解通过进行外部 API 调用来 returning 数据的正确编程方法。
在我继续创建自己的 swift 代码重用框架(管理我的应用程序的所有其余 api 调用)之前,我想询问社区他们如何处理以下情况:
这里我们有一个在登录视图上点击的按钮,我们需要调用我们的身份验证服务,并对我们返回的内容做出反应。
viewController:
import myLib
@IBAction func loginButtonTapped(sender: AnyObject) {
let email = emailField.text!
let password = pwField.text!
let loginResult = myLib.login(email,password)
if (loginResult.success) {
NSUserDefaults.standardUserDefaults().setBool(true, forKey: "isUserLoggedIn")
NSUserDefaults.standardUserDefaults().synchronize()
self.dismissViewControllerAnimated(true, completion: nil)
} else {
displayAlertMessage(loginResult.message)
}
}
myLib.login:
import Foundation
import Alamofire
import SwiftyJSON
public func Login(email: String, password: String, completion: ((success: Bool, message: String?, token: String?) -> Void)) {
let parameters: [String: String] = [
"username" : email,
"password" : password
]
let endpoint = "https://api.foo.bar/login"
Alamofire.request(.POST, endpoint, parameters: parameters, encoding: .JSON)
.responseJSON { response in
guard response.result.error == nil else {
print(response.result.error!)
completion(success: false, message: "error calling POST on /account/login", token: nil)
return
}
if let value = response.result.value {
let apiResponseJSONBody = JSON(value)
completion(success: true, message: nil, token: apiResponseJSONBody["token"].string)
}
}
}
- 将结果作为结构传回是否正确?我注意到我们必须创建结构 public 才能 return 它。
谢谢!我非常感谢所有反馈。
更新:相关问题已发布:Swift Alamofire + Promise catching
您不能使用 Login
方法的 return 值,因为请求是异步的。
基本上,您的 Login
方法将始终 return 立即 success = false
。
到return异步,需要在Login
添加完成块:
public func Login(email: String, password: String, completion: (success: Bool, message: String?, token: String?) -> Void) {
...
}
然后,当您收到来自 Alamofire 的响应时,像这样调用您的完成块:
completion(success: false, message: nil, token: nil)
在您的视图控制器中,您可以像这样使用 Login
:
myLib.Login(email, password) { success, message, token in
if success {
...
}
}