分享一个14年写的用户管理类-swift版
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版的更多相关文章
- 用标准Struts2+mvc写的用户管理
这星期的实验,最终调好了. 一句话,麻雀虽小,五脏俱全.相信刚学struts2的同学能够通过该实验能够更好地理解struts的结构和mvc 登录的之前写过,这里直接进入用户管理 用struts2都要在 ...
- [Java] 实现一个基于命令行的用户管理
实现基于一个命令行的用户管理,控制台操作 控制类 /* * 文 件 名: mvc.my.test.UserInterface.java * 版 权: XXX Technologies Co., Ltd ...
- 分享一个简单的C#的通用DbHelper类(支持数据连接池)
每次新项目的时候,都要从头去找一遍数据库工具类.这里分享一个简单实用的C#的通用DbHelper工具类,支持数据连接池. 连接池配置 <connectionStrings> <add ...
- 分享一个的c++写的,模仿awk的框架类CAwkDoc
这是我好多年前,模仿awk写的. awk大家都比较熟悉,使用awk处理文件,读取文件,分割字段这些工作awk自己帮你实现了. 程序员只要编写业务逻辑代码,并且awk还提供了很多常用的字符串操作函数,可 ...
- Linux用户管理命令(第二版)
添加用户 1.useradd -设置选项 用户名 [-D 查看缺省参数 ] 选项: u: UID [必须是系统中没有的] g:缺省所属用户组GID[最好有] G: 指定用户所属多个组[可以指定这个用户 ...
- Linux用户管理案例(第二版)
批量添加用户 1.按照/etc/passwd文件格式编写用户信息文件users.info xiaofang01::1001:503::/home/xiaofang01:/bin/bash #注意不能 ...
- 分享一个ASP.NET 文件压缩解压类 C#
需要引用一个ICSharpCode.SharpZipLib.dll using System; using System.Collections.Generic; using System.Linq; ...
- 一个可创建读取日志的管理类(可固定创建2M大小的日志文件)
这里,将日志管理基类命名为LogManagerBase(抽象类),具体的不同类型的日志可以通过继承完成.该基类可将日志以每个2M的方式存储起来,并可以读取当前正在使用的日志的所有内容. 要实现该基类, ...
- 分享一个c#t的网页抓取类
using System; using System.Collections.Generic; using System.Web; using System.Text; using System.Ne ...
随机推荐
- Log4j日志框架学习零到壹(一)
日志是系统开发过程中用于排查问题重要的记录.通常使用日志来记录系统运行的行为,什么时间点发生了什么 事情.Java中常用的莫过于Log4j框架了.下面主要围绕Log4j的基础知识.Log4j的使用方式 ...
- node读取文件转换json文件
{ ".323":"text/h323" , ".3gp":"video/3gpp" , ".aab" ...
- 腾讯基于Kubernetes的企业级容器云平台GaiaStack (转)
GaiaStack介绍 GaiaStack是腾讯基于Kubernetes打造的容器私有云平台.这里有几个关键词: 腾讯:GaiaStack可服务腾讯内部所有BG的业务: Kubernetes:Gaia ...
- SQL中IF和CASE语句
IF表达式 IF(A,B,C): 如果 A 是TRUE (A <> 0 and A<> NULL),则 IF()的返回值为B; 否则返回值则为 C.IF() 的返回值为数字值或 ...
- Win7 Win8 Win10取不到机器码的处理办法
1.更改UAC也就是用户账户的控制权限 2.以管理员身份运行软件
- 【转】BFG Repo-Cleaner: Removes large or troublesome blobs like git-filter-branch does, but faster.
https://rtyley.github.io/bfg-repo-cleaner/ an alternative to git-filter-branch The BFG is a simpler, ...
- sql语句(已在Oracle中测试,之后有添加内容放在评论中)
1增 1.1[创建一张表] create table 表名(列名 类型); 例: ),性别 ),出生日期 date); ),sex ),出生日期 date); 1.2[插入单行]insert [int ...
- unittest模块小结
这次写的是unittest模块的测试用例,属于自动化的门槛,进去了基本算自动化入了门,测试内容很简单,模拟给url推送用户名.密码测试登录功能 先上代码: #login_test.py import ...
- C#给checkboxList设置js选中事件
C#: for (int i = 0; i < this.CheckBoxList1.Items.Count; i++) { this.CheckBoxL ...
- SqlServer卡慢解决办法
SqlServer活动监视器调成1s刷新间隔 查看资源等待 (1)memory(内存)占用高时-->加内存(2)latch(业级锁)(并发量大时产生)-->调整cpu核心数可能解决(不一定 ...