分享一个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 ...
随机推荐
- c语言实现:三子棋
问题描述:两个游戏者在3*3棋盘里轮流作标记,如果一个人在行,列或者两个对角线可以作三个标记,则为获胜. 我们首先得打印菜单供玩家选择(可以选择玩游戏或者退出游戏) void menu() { pri ...
- zabbix自动发现华为,H3C交换机
一.添加自动发现规则 1.ip范围尽量别太大 zabbix是通过ARP来搜索符合条件的主机的 2.团体名和交换机要一样.这个OID值是提取系统信息的 在OID这块遇到个坑 我用Getif查询到的是1. ...
- [Android]Linux下WebRTC下载与编译
1.硬盘空间: WebRTC官方原话: The checkout size is large due the use of the Chromium build toolchain and many ...
- C# 字符串按 ASCII码 排序,注意其中的小坑
https://www.cnblogs.com/similar/p/6739293.html 在和银行做数据对接时,涉及到数据传输时的验签及加密.其中数据签名方案中就要求数据项根据属性名按 ASCII ...
- 关于 early Z 与 z-prepass
今天在考虑优化MOBA项目中的树木时(采用了ALPHATEST)时,与同事讨论中深入了解了这两个概念. 以前居然不知道有early z的存在,真是惭愧.... 上个链接: 深入剖析GPU Early ...
- angualrjs添加ngTouch
angularjs没有touch时间需要添加directive 插件代码如下 "use strict"; angular.module("ngTouch", [ ...
- 项目需求分析与建议-NABCD模型
N(Need 需求) 首先我们的创意解决了现有阶段学校查空余教师的问题,充分解决了同学们上自习却找不到教室的苦衷,同时也会适当的拓展一些适当的学习计时功能或者每日一语等等,来帮助同学们来控制好学习时间 ...
- event 事件2
4.事件类型 “DOM3级事件”规定了一下几类事件: 1)UI事件(用户界面事件),当用户与页面元素交互时触发 2)焦点事件,当元素获得或失去焦点时触发 3)鼠标事件,当用户通过鼠标在页面上执行操作时 ...
- windows下git 同步数据到github的常见问题
常用排错方法: 1,查看连接是否正常. 2,push数据有时会报错,这是由于远程repository和我本地的repository冲突造成. 解决方法: 1.使用强制push的方法: git push ...
- java实现将包含多个<REC>的文件拆成若干只包含一个<REC>的文件
遍历文件夹里的文件,将包含多个<REC>的文件拆成若干只包含一个<REC>的文件 package com.prepub; import java.io.BufferedRead ...