簡介
用戶信息一般都要用瞧筛,一般一開始從網(wǎng)絡讀取,然后就緩存起來导盅,隨用隨取驾窟。
緩存類型選擇
可以用磁盤緩存,沒有問題认轨;
也可以用內(nèi)存緩存绅络。APP重啟之后,就應該從網(wǎng)絡去取嘁字,時間太長恩急,大概率會有修改,需要更新一下纪蜒。本次就存在內(nèi)存緩存中
單例
內(nèi)存緩存衷恭,一般用單例來表示
習慣上,單例都會取名XXXManager
Swift的單例網(wǎng)上有好多種寫法纯续,選擇了最簡單的一種
// MARK: - 單例
final class UserServiceManager {
/// 單例實例
/// UserServiceManager.sharedInstance.就是單例的用法
static let sharedInstance = UserServiceManager()
}
靜態(tài)方法
直接調(diào)用單例随珠,一般都有XXX.sharedInstance.的樣子,感覺有點啰嗦猬错,所以考慮再封裝一層窗看,提供靜態(tài)方法,直接XXX.就可以了
封裝方式
OC一般分開兩個文件倦炒,但是Swift感覺只要一個文件就可以了
對外的接口用struct显沈,命名用XXXService;單例用class逢唤,放在同一個文件中拉讯,命名為XXXServiceManager
單例XXXServiceManager相當于具體實現(xiàn),結構體XXXService相當于對外接口
所以訪問參數(shù)鳖藕,單例用fileprivate魔慷,結構體用public
import Foundation
// MARK: - 公共接口
struct UserService {
/// 判斷用戶信息是否為空
public static func isUserInfoNotEmpty() -> Bool {
if let userInfo = getUserInfo(), let userId = userInfo.userId {
return (userId > 0)
} else {
return false
}
}
/// 保存用戶信息;設置為nil著恩,就是清空
public static func saveUserInfo(_ userInfo: UserInfoModel?) {
UserServiceManager.sharedInstance.saveUserInfo(userInfo)
}
/// 讀取用戶信息
public static func getUserInfo() -> UserInfoModel? {
return UserServiceManager.sharedInstance.getUserInfo()
}
}
// MARK: - 單例
final class UserServiceManager {
/// 單例實例
/// UserServiceManager.sharedInstance.就是單例的用法
fileprivate static let sharedInstance = UserServiceManager()
// MARK: - 接口
fileprivate func saveUserInfo(_ userInfo: UserInfoModel?) {
self.userInfo = userInfo
}
fileprivate func getUserInfo() -> UserInfoModel? {
return self.userInfo
}
// MARK: - 屬性
private var userInfo: UserInfoModel? = nil
}
存取方法
默認從緩存中取就可以了院尔,
如果緩存中沒有纹烹,那么就需要訪問網(wǎng)絡,
如果懷疑有更新召边,不想取緩存中的值铺呵,直接訪問網(wǎng)絡,那么就提供一個參數(shù)useCache來控制
每次網(wǎng)絡數(shù)據(jù)返回隧熙,如果不為空片挂,就緩存在內(nèi)存緩存中,隨時備用
/// User模塊接口封裝
struct UserApi {
/// 獲取用戶信息贞盯;默認從內(nèi)存緩存纫裟睢;緩存沒有躏敢,才訪問網(wǎng)絡闷愤;useCache = false, 從網(wǎng)絡取
public static func asyncGetUserInfo(useCache: Bool = true) async -> UserInfoModel? {
if (useCache && UserService.isUserInfoNotEmpty()) {
return UserService.getUserInfo()
} else {
let moYaModel = await MoyaNetworkManager.sharedInstance.asyncRequest(command: .userGetUserInfo)
if let userInfo = UserInfoModel.deserialize(from:moYaModel.data as? Dictionary<String, Any>) {
/// 保存到內(nèi)存中緩存起來
UserService.saveUserInfo(userInfo)
return userInfo
} else {
return nil
}
}
}
}
使用
使用的時候,不需要關心數(shù)據(jù)來自哪里件余,直接用就好了讥脐。如果想更新,通過useCache控制一下就可以了
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
navigationController?.setNavigationBarHidden(true, animated: animated)
Task {
if let data = await UserApi.asyncGetUserInfo(useCache: true) {
debugPrint(data)
}
}
}