userManager(实训)

路由只是相当于将那些请求区分然后把他跟要传的参数什么的匹配一下,列好,非常清晰,但是很明显,没有具体的方法实现代码。Router关注的是要发送的请求,就是Alamofire.request()括号里面的,但是真的要发送请求,然后把再对返回的数据进行解析什么的还是要用userManager。还是先贴代码!!

import Foundation
import Alamofire
import UIKit
import SwiftyJSON

public class UserManager: Notifier {
    
    public static let shared: UserManager = UserManager()
    
    fileprivate let userDefaults = UserDefaults.standard
    
    // MARK: - 用户相关
    
    var isLogIn = false
    
    //手机号
    var tel = ""
    //密码
    private var password = ""
    //token
    private var token = ""
    //昵称
    var username = ""
    //信用等级
    private var creditLevel = ""
    //头像
    var avatar: UIImage?
    //地点
    var location = ""
    
    public enum Notification : String {
        case didGetMessage
        case didGetMessageFailure
        case didexists
        case didexistsFailure
        case didSignup
        case didSignupFailure
        case didLogin
        case didLoginFailure
        //        case didLogout
        //        case didLogoutFailure
        case didGetUserInfo
        case didGetUserInfoFailure
        case didSetUserInfo
        case didSetUserInfoFailure
        case didGetUserAvatar
        case didGetUserAvatarFailure
    }
    
    private enum Action {
        //获取验证码
        case getMessage
        case exists
        case signUp
        case logIn
        case getUserInfo
        case setUserInfo
        case getAvatar
        case getCarInfo
    }
    
    private let actionDict: [Action: (Notification, Notification)] =
        [.getMessage: (.didGetMessage, .didGetMessageFailure),
         .exists: (.didexists, .didexistsFailure),
         .signUp: (.didSignup, .didSignupFailure),
         .logIn: (.didLogin, .didLoginFailure),
         .getUserInfo: (.didGetUserInfo, .didGetUserInfoFailure),
         .setUserInfo: (.didSetUserInfo, .didSetUserInfoFailure),
         .getAvatar: (.didGetUserAvatar, .didGetUserAvatarFailure)]
    
    private func handleResult(_ action: Action, _ response: DataResponse<Any>, completionHandler: (JSON) -> ()) {
        switch response.result {
        case .success:
            guard let value = response.result.value else {
                log("response.result.value is nil", .error)
                return
            }
            let json = JSON(value)
            guard let status = json["status"].int else { return }
            guard status == 200 else {
                log(json, .error)
                
                let (_, failureNoti) = actionDict[action]!
                UserManager.postNotification(failureNoti)
                
                return
            }
            let (successNoti, _) = actionDict[action]!
            completionHandler(json)
            UserManager.postNotification(successNoti)
            return
        case .failure(let error):
            log(error, .error)
            let (_, failureNoti) = actionDict[action]!
            UserManager.postNotification(failureNoti)
            return
        }
    }
    
    func getMessage(_ phone: String) {
        log("send message to \(phone)", .json)
        DispatchQueue.main.asyncAfter(deadline: .now() + .seconds(2), execute: {
            UserManager.postNotification(.didGetMessage)
        })
    }
    
    func exists(tel: String) {
        Alamofire.request(Router.exists(tel)).responseJSON { response in
            self.handleResult(.exists, response, completionHandler: { (json) in
                log(json, .json)
            })
        }
    }
    
    func signup(tel: String, password: String) {
        Alamofire.request(Router.signUp(tel, password)).responseJSON { response in
            self.handleResult(.signUp, response, completionHandler: { (json) in
                log(json, .json)
            })
        }
    }
    
    func login(tel: String, password: String) {
        Alamofire.request(Router.logIn(tel, password)).responseJSON { response in
            self.handleResult(.logIn, response, completionHandler: { (json) in
                log(json, .json)
                
                self.token = json["data"].string!
                log(self.token, .json)
                
                self.isLogIn = true
                self.getUserInfo()
                // 用url获得头像
                //self.avatar = UIImage(data: <#T##Data#>)
                
                self.tel = tel
                self.password = password
                
                self.userDefaults.set(true, forKey: "didLogInLastTIme")
                self.userDefaults.set(self.tel, forKey: "tel")
                self.userDefaults.set(self.password, forKey: "password")
                self.userDefaults.synchronize()
            })
        }
    }
    
    func getUserInfo() {
        Alamofire.request(Router.getUserInfo()).responseJSON { response in
            self.handleResult(.getUserInfo, response, completionHandler: { (json) in
                log(json, .json)
                self.location = json["result"]["location"].string!
                self.username = json["result"]["username"].string!
                
            })
        }
    }
    
    func setUserInfo(username: String, location: String) {
        Alamofire.request(Router.setUserInfo(username, location)).responseJSON { response in
            self.handleResult(.setUserInfo, response, completionHandler: { (json) in
                log(json, .json)
                
            })
        }
    }
    
    func setUserAvatar() {
        Alamofire.request(Router.setUserAvatar()).responseJSON { response in
            log(response, .url)
//            guard let image = response.result.value as? UIImage else {
//                log("convert to image failure", .error)
//                log(response, .error)
//                self.avatar = UIImage(named: "left_icon_defaultAvatar")
//                UserManager.postNotification(.didGetUserAvatarFailure)
//                return
//            }
//            self.avatar = image
//            UserManager.postNotification(.didGetUserAvatar)
        }
    }
    
    
    func userLogOut(){
        
        isLogIn = false
        
        password = ""
        token = ""
        username = ""
        tel = ""
        location = ""
        creditLevel = ""
        avatar = nil
        
        // 设置上次登录信息
        userDefaults.set(false, forKey: "didLogInLastTIme")
        userDefaults.set("", forKey: "tel")
        userDefaults.set("", forKey: "password")
        userDefaults.synchronize()
        
    }
    
    func getToken() -> String {
        return self.token
    }
    
    func logInWithLastTimeInfo() {
        if userDefaults.bool(forKey: "didLogInLastTIme") {
            let tel = userDefaults.string(forKey: "tel")
            let password = userDefaults.string(forKey: "password")
            log(tel, .happy)
            log(password, .happy)
            self.login(tel: tel!, password: password!)
        }
    }
    
    
其实看了前面写的Alamofire发网络请求的那一章,应该就没什么不明白的了,也应该能看明白Router跟userManager的关系了。其实这里就是把前面说的用Alamofire发送的网络挪过来了,然后发送的请求,以及发送请求的方式,都用Router封装好了。这样的话,等到我们在登录注册界面编写的时候,就不用再写用Alamofire发送各种手机号什么的参数,或者再解析JSON数据了,直接调用userManager里的相应的方法就行了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值