做APP,涉及到使用者登入的,就避免不了使用者的資訊本地化,更有甚者是持久化存儲。
當使用者登入之後,會生成多個使用者屬性,比如使用者的昵稱,頭像,身份token等,在APP中多處可能都用到使用者的基本資訊,比如頭像和昵稱,是不是在每次用到的時候都需要請求一次呢,那當然不是必要的,下面介紹下曾經在工作中遇到的幾個方案:
1.使用者登入之後,使用單例執行個體化使用者類,屬性指派,屬性修改。單例保證目前類有且隻有一個對象被執行個體化,相當于在APP中出現一個大家都能溝通的對象,A可以從這個對象擷取想要的屬性值,并且修改了某個屬性,此時B也來了,B直接可以取到A修改完成的屬性值,保持A和B拿到資訊的一緻性。那麼此時又遇到一個問題,當APP被殺死後再次被打開,此時使用者的資訊從哪來,有兩種方案:
方案A:把使用者的身份辨別token使用持久化存儲的方式存到本地,NSKeyedArchiver,NSUserDefaults,Core Data,以及資料庫,都可以用,然後當使用者打開APP的時候,用存儲的token再去請求使用者的資訊,并執行個體化指派,這時候需要考慮到後端對于token的一個設計方案,如果随時可變,那就得考慮存儲其他的身份辨別。
方案B:本地持久化存儲使用者所有的屬性,相當于把使用者對象存儲到本地,當使用者登入之後存儲使用者所有的屬性。是不是感覺比A
方案更好使,但此時遇到一個很麻煩的事情,當使用者的屬性被修改之後,使用者單例對象的值修改了,但是本地的持久化存儲沒有修改啊,然後再封裝一個方法,每次修改使用者屬性之後,調用一次儲存方法,保證單例對象和本地存儲的資料是一緻的,甲修改了單例對象的昵稱屬性,忘記了存儲怎麼辦。為了解決這個問題,我們引入一個不會忘記替我們做存儲工作的概念,使用監聽單例屬性的方式,當監聽到屬性值發生變化的時候,自動執行本地持久化存儲的修改就可以了。
使用方案B之後,你就會發現一個單例對象非常的繁重,既有使用者屬性指派的代碼,還有監聽者的代碼,還有持久化存儲的代碼,可以用但是不專業,那麼此時有一個替你去管理單例對象屬性的它出現了:
一個單例對象的管理者-manager,manager負責觀察監聽單例對象的屬性的變動,負責将修改後的值持久化存儲到本地,是不是顯得更加進階。
此時有可能你會發現一個管理者直接去執行存儲工作,是不是不大公平,然後你就會建立一個工具類,編寫一個類方法,專門做本地持久化存儲的工作,你的管理者告訴工具類存一下,好了,工具類給你存了就。
存儲的流程結束了,那麼取用的時候怎麼辦呢,單例對象初始化時需要manager去擷取持久化存儲的内容,然後給單例對象指派。至此,一個完整的帶有本地存儲的使用者類完成。