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. P4702 取石子

    我什么时候写一下污污的小故事呢?反正不是现在. 题目描述 Alice 和 Bob 在玩游戏. 他们有 nn 堆石子,第 ii 堆石子有 a_iai​ 个,保证初始时 a_i \leq a_{i + 1 ...

  2. Android Studio上传代码到Coding.net

    1.官方帮助文档:https://coding.net/help/doc/git/import-from-local.html 2.简单点: https://git.coding.net/javaka ...

  3. ES match match_phrase term willcard的查询原理

    比如:要求实现SQL中like “%xxxx%”的匹配效果. wildcard通配 这种效果在ES中最匹配的做法是用wildcard query通配,这种情况不会对query分词,而是直接遍历倒排索引 ...

  4. Game Engine Architecture 8

    [Game Engine Architecture 8] 1.Differences across Operating Systems • UNIX uses a forward slash (/) ...

  5. 寻找遗失的tags

    现象:查询数据库,存在tags:{} 的字段,但是api查询时,不存在tags字段 日志定位Sample的init方法中对resource_metadata的扁平处理: 3.对应方法分析 在ceilo ...

  6. Selenium Grid和IE /Firefox各种填坑

    使用selenium grid的步骤 1.确保hub和node都安装并且配置好了java jdk. 2.在hub上运行以下命令. java -jar C:\Software\selenium\sele ...

  7. java钉钉通讯录同步

    钉钉做了好好几个项目了,和阿里云还有阿里钉钉合作也挺不错.因为之前就做过微信公众号,接触钉钉感觉还是比较顺手的,虽然也有一些不一样的地方. 因为之前写了一个微信公众号的开发文档,一直想写一个钉钉的开发 ...

  8. python--第二十天总结(Django的一些注意)

    关闭Django模板的自动转义 Django的模板中会对HTML标签和JS等语法标签进行自动转义,原因显而易见,这样是为了安全.但是有的时候我们可能不希望这些HTML元素 被转义,比如我们做一个内容管 ...

  9. 登录注册页面(连接MySQL8.0.15版本)

    原文链接:https://mp.weixin.qq.com/s?__biz=MzI4Njg5MDA5NA==&mid=2247483779&idx=1&sn=e23e68e96 ...

  10. 安装sklearn_简练解决

    安装sklearn_简练解决 < 关键步骤标黑 > 第一步:更新pip  python -m pip install --upgrade pip 第二步:安装 scipy 在网址http: ...