AccountManager类 14年设计,从swift 0.9开始,迭代到现在swift4.0版本,总体几乎没什么改动,简单稳定。

其实现的思路主要还是借助之前net反射的经验,实现了自动保存用户信息本地,同样这个方案也在android上实现了,有想法的同学自己再去实现一般(虽然我这也有,但是就没必要贴出来了,android实现比swift更简单)

话不多说,代码挺简单的,其中依赖SwiftyJSON这个库,相信这个是所有swift项目都会使用的

使用

if(AccountManager.loginStatus){

   print(">>>user aid:\(AccountManager.currentUser!.aid!)")

}
 
import Foundation

/// 登陆获取用于信息通知
let KNotifWithThirdLoginUserInfo = "KNotifWithThirdLoginUserInfo"
let KNotifWithLogout = "KNotifWithLogout"
var _currentUser: UserInfo?
class AccountManager {
static var loginStatus:Bool{
get{
return AccountManager.currentUser != nil
}
} static func userLogin(_ info:UserInfo?){
AccountManager.currentUser = info
NotificationCenter.default.post(name: Notification.Name(rawValue: KNotifWithChangeUser), object:nil)
} static func userAutoLogin(){
    
if AccountManager.loginStatus{
KAPIService.requestLoginByToken { (userModel,err) in
if(userModel != nil){
if(userModel != nil && userModel?.model?.errcode == ){
AccountManager.currentUser = userModel?.model?.data.first
//可以在这儿通知构建用户登录后的数据库等相关逻辑
}else if(userModel != nil && userModel?.model?.errcode == ){
AccountManager.userLogout()
}
}
}
} } static func userLogout(){
AccountManager.currentUser = nil
KUserDefaults.set(nil, forKey: KNotifWithThirdLoginUserInfo)
NotificationCenter.default.post(name: Notification.Name(rawValue: KNotifWithChangeUser), object:nil)
} class var currentUser: UserInfo? {
get {
if _currentUser == nil {
if let d = KUserDefaults.object(forKey: KNotifWithThirdLoginUserInfo) as? Data {
_currentUser = UserInfo(anyObject:"" as AnyObject)
do {
let json = try JSON(data:d)
_currentUser?.initData(json)
} catch{}
}
if let u = _currentUser{
if (u.aid == nil){
_currentUser = nil
}
}
}
return _currentUser
}
set(user) {
_currentUser = user
if let v = _currentUser{
let data = try! JSONSerialization.data(withJSONObject: v.toDictionary(), options: [])
KUserDefaults.set(data, forKey: KNotifWithThirdLoginUserInfo)
} else {
//MARK: - 在swift3.x开始就不能set nil了,nil并不会删除key
//KUserDefaults.set(nil, forKey: KNotifWithThirdLoginUserInfo)
KUserDefaults.removeObject(forKey: KNotifWithThirdLoginUserInfo)
}
KUserDefaults.synchronize()
}
} class func EnableCurrentUserDebugMode(){
// #if DEBUG
// AccountManager.currentUser = UserInfo(JSON: "")
// AccountManager.currentUser!.id = 1
// AccountManager.currentUser!.name = "测试用户"
// AccountManager.currentUser!.vip = 0
// AccountManager.currentUser!.avatar = ""
// if let v = "\(NSDate().timeIntervalSince1970)".toInt(){
// AccountManager.currentUser!.expire = v
// }
// AccountManager.currentUser!.email = ""
// #endif
}
}
//
// KCacheModel.swift
// import Foundation class KCacheModel:NSObject,KResponseItemSerializable{
required init(anyObject: AnyObject) {
super.init()
} func converAnyToNSValue(_ anyValue:Any) -> NSObject? {
switch(anyValue) {
case let intValue as Int:
return NSNumber(value: CInt(intValue) as Int32)
case let doubleValue as Double:
return NSNumber(value: CDouble(doubleValue) as Double)
case let stringValue as String:
return stringValue as NSString
case let boolValue as Bool:
return NSNumber(value: boolValue as Bool)
case let primitiveArrayValue as Array<String>:
return primitiveArrayValue as NSArray
case let primitiveArrayValue as Array<Int>:
return primitiveArrayValue as NSArray
default:
return NSNull()
}
} //对象转字典
func toDictionary()-> NSMutableDictionary{
let modelDictionary:NSMutableDictionary = NSMutableDictionary()
let aMirror = Mirror(reflecting: self)//reflect(self)
for case let (label?, value) in aMirror.children {
print("lab:\(label) val:\(value)")
if let nsValue=converAnyToNSValue(value) {
modelDictionary.setValue(nsValue, forKey:label)
}
}
return modelDictionary
}
}

KCacheModel.swift

import Foundation
class UserInfo:KCacheModel{
required init(anyObject: AnyObject) {
super.init(anyObject: anyObject)
let jo = JSON(anyObject)
self.initData(jo)
} // convenience init(_ jo:JSON) {}
func initData(_ jo:JSON) {
//从本地读取和从远程读取,存储结构不一样,所以需要定制处理
if let v = jo["app_token"].string{
self.token = v
}else{
self.token = jo["token"].string
}
if let v = jo["app_token_exp"].string{
self.token_exp = v
}else{
self.token_exp = jo["token_exp"].string
}
if let v = jo["user_info"]["aid"].string{
self.aid = v
}else{
self.aid = jo["aid"].string
}
if let v = jo["user_info"]["name"].string{
self.name = v
}else{
self.name = jo["name"].string
}
if let v = jo["user_info"]["head_img_url"].string{
self.avatar = v
}else{
self.avatar = jo["avatar"].string
}
} var token:String?
var token_exp:String? //用户名称
var aid:String?
var avatar:String? //头像
var name:String?
}

UserInfo.swift

protocol KResponseItemSerializable {
init(anyObject:AnyObject)
}

KResponseItemSerializable

最后,记得修改用户的属性记得这么用

AccountManager.currentUser?.name = "新名字"

AccountManager.currentUser = AccountManager.currentUser//这是为了更新缓存

分享一个14年写的用户管理类-swift版的更多相关文章

  1. 用标准Struts2+mvc写的用户管理

    这星期的实验,最终调好了. 一句话,麻雀虽小,五脏俱全.相信刚学struts2的同学能够通过该实验能够更好地理解struts的结构和mvc 登录的之前写过,这里直接进入用户管理 用struts2都要在 ...

  2. [Java] 实现一个基于命令行的用户管理

    实现基于一个命令行的用户管理,控制台操作 控制类 /* * 文 件 名: mvc.my.test.UserInterface.java * 版 权: XXX Technologies Co., Ltd ...

  3. 分享一个简单的C#的通用DbHelper类(支持数据连接池)

    每次新项目的时候,都要从头去找一遍数据库工具类.这里分享一个简单实用的C#的通用DbHelper工具类,支持数据连接池. 连接池配置 <connectionStrings> <add ...

  4. 分享一个的c++写的,模仿awk的框架类CAwkDoc

    这是我好多年前,模仿awk写的. awk大家都比较熟悉,使用awk处理文件,读取文件,分割字段这些工作awk自己帮你实现了. 程序员只要编写业务逻辑代码,并且awk还提供了很多常用的字符串操作函数,可 ...

  5. Linux用户管理命令(第二版)

    添加用户 1.useradd -设置选项 用户名 [-D 查看缺省参数 ] 选项: u: UID [必须是系统中没有的] g:缺省所属用户组GID[最好有] G: 指定用户所属多个组[可以指定这个用户 ...

  6. Linux用户管理案例(第二版)

    批量添加用户 1.按照/etc/passwd文件格式编写用户信息文件users.info xiaofang01::1001:503::/home/xiaofang01:/bin/bash  #注意不能 ...

  7. 分享一个ASP.NET 文件压缩解压类 C#

    需要引用一个ICSharpCode.SharpZipLib.dll using System; using System.Collections.Generic; using System.Linq; ...

  8. 一个可创建读取日志的管理类(可固定创建2M大小的日志文件)

    这里,将日志管理基类命名为LogManagerBase(抽象类),具体的不同类型的日志可以通过继承完成.该基类可将日志以每个2M的方式存储起来,并可以读取当前正在使用的日志的所有内容. 要实现该基类, ...

  9. 分享一个c#t的网页抓取类

    using System; using System.Collections.Generic; using System.Web; using System.Text; using System.Ne ...

随机推荐

  1. FPGA笔试必会知识点1--数字电路基本知识

    组合逻辑与时序逻辑 组合逻辑电路:任意时刻电路输出的逻辑状态仅仅取决于当时输入的逻辑状态,而与电路过去的工作状态无关. 时序逻辑电路:任意时刻电路输出的逻辑状态不仅取决于当时输入的逻辑状态,而与电路过 ...

  2. thinkphp5.1的公共函数库 common.php

    首先引入Db类 或者是模型 use think\Db; 然后写公共函数 function getUserName($id){ return Db::table('zh_user')->where ...

  3. activiti官网实例项目activiti-explorer之扩展多选框回显功能

    相关参考链接:https://blog.csdn.net/murongxuesheng/article/details/76147380 回显:确认选中属性ng-model,循环属性ng-repeat ...

  4. css 效果之转换

    在css3 中,有一个转换效果,也可以替代js,并且比 js 做得好,那就是转换,即transform 属性,只需要个这个属性加上值,就可以实现转化效果了;有三种值,平移(translate),旋转( ...

  5. 一文让你秒懂互联网TCP/IP协议的深层含义

    什么是 TCP/IP 协议 首先,协议,可以理解为是一套统一的规则,就像行业标准.由于互联网主要的功能是传输信息,所以其协议一般是管理系统之间如何相互通信的规则. 用邮政和物流等线下的“运输协议”来理 ...

  6. 缓存:前端页面缓存、服务器缓存(依赖SQL)MVC3

    缓存依赖数据库 第一步 1通过vs里面带的命令提示窗口. 2或者.NET Framework 版本 4(64 位系统)条件,%windir%\Microsoft.NET\Framework64\v4. ...

  7. 前端笔记-javaScript-2

    一.JavaScript的对象 简介: 在JavaScript中除了null和undefined以外其他的数据类型都被定义成了对象,也可以用创建对象的方法定义变量,String.Math.Array. ...

  8. Linux实操篇

    一:用户管理.群组管理 增: 1.指定群组添加账户: groupadd test 创建test用户组useradd -g test(用户组) xiaoming(用户名)       ---- 创建us ...

  9. Linux内核d_path函数应用的经验总结

    问题背景 一个内核模块中,需要通过d_path接口获取文件的路径,然后与目标文件白名单做匹配. 在生产环境中,获取的文件是存在的,但是与文件白名单中的文件总是匹配失败. 问题定位: 通过打印d_pat ...

  10. cv2.error: openCV报错

    运行openCV程序,出现了.cv2.error: OpenCV(4.1.0) D:\Build\OpenCV\opencv-4.1.0\modules\imgproc\src\color.cpp:1 ...