struct User {
let username: String
let password: String
}
class AuthService {
func login(user: User, completion: @escaping (Bool) -> Void) {
// 模拟网络请求的异步处理
DispatchQueue.global().asyncAfter(deadline: .now() + 1.0) {
// 简单验证逻辑:用户名和密码都等于 "admin" 时返回成功
let isSuccess = (user.username == "admin" && user.password == "admin")
completion(isSuccess)
}
}
}
protocol LoginView: AnyObject {
func showLoading()
func hideLoading()
func showLoginSuccess()
func showLoginFailure()
}
class LoginViewController: UIViewController, LoginView {
private let presenter = LoginPresenter(authService: AuthService())
override func viewDidLoad() {
super.viewDidLoad()
presenter.attachView(self) // 关联 Presenter
}
@IBOutlet weak var usernameTextField: UITextField!
@IBOutlet weak var passwordTextField: UITextField!
@IBAction func loginButtonTapped(_ sender: UIButton) {
guard let username = usernameTextField.text, let password = passwordTextField.text else { return }
presenter.login(username: username, password: password)
}
func showLoading() {
// 显示加载指示器
}
func hideLoading() {
// 隐藏加载指示器
}
func showLoginSuccess() {
// 显示登录成功信息
}
func showLoginFailure() {
// 显示登录失败信息
}
}
class LoginPresenter {
private let authService: AuthService
private weak var view: LoginView?
init(authService: AuthService) {
self.authService = authService
}
func attachView(_ view: LoginView) {
self.view = view
}
func login(username: String, password: String) {
view?.showLoading()
let user = User(username: username, password: password)
authService.login(user: user) { [weak self] isSuccess in
DispatchQueue.main.async {
self?.view?.hideLoading()
if isSuccess {
self?.view?.showLoginSuccess()
} else {
self?.view?.showLoginFailure()
}
}
}
}
}