Alamofire 和 completionHandler 的使用
Posted
技术标签:
【中文标题】Alamofire 和 completionHandler 的使用【英文标题】:Using of Alamofire and completionHandler 【发布时间】:2017-05-10 19:03:27 【问题描述】:大家好,非常感谢您的帮助!我是编程新手,如果 smth 看起来很愚蠢或很奇怪,我很抱歉。
我正在制作我的应用的登录页面。我有 2 个字段 - email 和 password。我创建了一个具有 email 和 class、bool isLoggedIn 和 func authenticateUser 属性的类 User >,执行 POST 请求。
我的逻辑:
用户输入电子邮件和密码并按下登录按钮。
这将创建一个具有 isLoggedIn 值 false
的类对象它还向服务器执行 POST 请求
如果响应确认此类用户,isLoggedIn 将更改为 true,并且正在执行转到主页。
对于请求,我使用 Alamofire。如果我理解正确的话,我只能通过使用completionhandler 来更改isLoggedIn 的值。但这对我不起作用 - isLoggedIn 的值没有改变,而第二部分代码中的 resultBool 变为 true。 p>
我确定我有一个错误,但已经 4 天了,我不明白在哪里。我将非常感谢任何形式的建议和帮助。
这是我的代码:
import Foundation
import Alamofire
class User
let defaults = UserDefaults.standard
var email: String
var password: String
var isLoggedIn: Bool
init(email: String, password: String)
self.email = email
self.password = password
self.isLoggedIn = false
// Perform authentication
func authenticateUser(user: User, completionHandler: @escaping (_ result: Bool) -> ())
makeAuthenticateUserCall(user: user, completionHandler: completionHandler)
// Perform POST request
func makeAuthenticateUserCall(user: User, completionHandler: @escaping (Bool) -> ())
let parameters = [
"email" : user.email,
"password" : user.password
]
Alamofire.request("http://apistaging.server.com/api/v1/login", method: .post, parameters: parameters, encoding: URLEncoding.httpBody).responseJSON response in
switch response.result
case .success:
if let json = response.result.value as? [String: Any],
let status = json["status"] as? String,
status == "success"
completionHandler(true)
case .failure:
completionHandler(false)
来自 ViewController 的代码:
@IBAction func loginButtonPressed(_ sender: UIButton)
if let email = _email.text
if let password = _password.text
let user = User(email: email, password: password)
user.authenticateUser(user: user) resultBool in
user.isLoggedIn = resultBool
if user.isLoggedIn
self.performSegue(withIdentifier: "MainPageViewController", sender: nil)
【问题讨论】:
segue 需要在完成处理程序中执行 谢谢,但为什么以及如何? 【参考方案1】:您在实际返回之前检查了结果:
if let password = _password.text
let user = User(email: email, password: password)
user.authenticateUser(user: user) resultBool in
user.isLoggedIn = resultBool
if resultBool
DispatchQueue.main.async
self.performSegue(withIdentifier: "MainPageViewController", sender: nil)
【讨论】:
以上是关于Alamofire 和 completionHandler 的使用的主要内容,如果未能解决你的问题,请参考以下文章
你如何干净地关闭 AsynchronousSocketChannel?
Alamofire 自定义响应从 Alamofire v1.3 迁移到 3.0(和 Swift 2 语法)
哪个是 xcode 7.2 支持的 alamofire 对象映射器和 alamofire pod 版本