Swift單例實踐 2023-05-20 周六

簡介

用戶信息一般都要用瞧筛,一般一開始從網(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)
            }
        }
    }
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末啼器,一起剝皮案震驚了整個濱河市旬渠,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌端壳,老刑警劉巖告丢,帶你破解...
    沈念sama閱讀 218,122評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異损谦,居然都是意外死亡岖免,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,070評論 3 395
  • 文/潘曉璐 我一進店門照捡,熙熙樓的掌柜王于貴愁眉苦臉地迎上來颅湘,“玉大人,你說我怎么就攤上這事麻敌≌こ矗” “怎么了掂摔?”我有些...
    開封第一講書人閱讀 164,491評論 0 354
  • 文/不壞的土叔 我叫張陵术羔,是天一觀的道長。 經(jīng)常有香客問我乙漓,道長级历,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,636評論 1 293
  • 正文 為了忘掉前任叭披,我火速辦了婚禮寥殖,結果婚禮上玩讳,老公的妹妹穿的比我還像新娘。我一直安慰自己嚼贡,他們只是感情好熏纯,可當我...
    茶點故事閱讀 67,676評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著粤策,像睡著了一般樟澜。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上叮盘,一...
    開封第一講書人閱讀 51,541評論 1 305
  • 那天秩贰,我揣著相機與錄音,去河邊找鬼柔吼。 笑死毒费,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的愈魏。 我是一名探鬼主播觅玻,決...
    沈念sama閱讀 40,292評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼培漏!你這毒婦竟也來了串塑?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 39,211評論 0 276
  • 序言:老撾萬榮一對情侶失蹤北苟,失蹤者是張志新(化名)和其女友劉穎桩匪,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體友鼻,經(jīng)...
    沈念sama閱讀 45,655評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡傻昙,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,846評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了彩扔。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片妆档。...
    茶點故事閱讀 39,965評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖虫碉,靈堂內(nèi)的尸體忽然破棺而出贾惦,到底是詐尸還是另有隱情,我是刑警寧澤敦捧,帶...
    沈念sama閱讀 35,684評論 5 347
  • 正文 年R本政府宣布须板,位于F島的核電站,受9級特大地震影響兢卵,放射性物質發(fā)生泄漏习瑰。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,295評論 3 329
  • 文/蒙蒙 一秽荤、第九天 我趴在偏房一處隱蔽的房頂上張望甜奄。 院中可真熱鬧柠横,春花似錦、人聲如沸课兄。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,894評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽烟阐。三九已至糜俗,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間曲饱,已是汗流浹背悠抹。 一陣腳步聲響...
    開封第一講書人閱讀 33,012評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留扩淀,地道東北人楔敌。 一個月前我還...
    沈念sama閱讀 48,126評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像驻谆,于是被迫代替她去往敵國和親卵凑。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,914評論 2 355

推薦閱讀更多精彩內(nèi)容