用單例模式優(yōu)化本地存儲

1.用單例設(shè)計(jì)存儲數(shù)據(jù)接口


1.1單例接口

+ (AppScene *)sharedInstance;

1.2數(shù)據(jù)序列化接口

- (void)serializeValue:(id)value withKey:(NSString *)key;

1.3數(shù)據(jù)反序列化接口

- (id)deserializeValueWithKey:(NSString *)key;

2.用單例接口隔離實(shí)現(xiàn)細(xì)節(jié)


2.1替代NSCoding協(xié)議

  • 在實(shí)現(xiàn)之前先簡單介紹一下fastCoding闯冷,因?yàn)檫^程中會用到fastCoding
    fastCoding是用來替代系統(tǒng)的NSCoding的協(xié)議 可以將對象序列化成NSData爱榔,也可以反序列化成對象培愁。
  • fastCodin在github鏈接或者在github上搜索fastCoding看到star最多的就是。
  • 解壓得到圖中目錄,有用的就只有FastCoder目錄的兩個(gè)文件厨钻,將這兩個(gè)文件加入項(xiàng)目中,編譯會發(fā)現(xiàn)有問題。在ARC下會運(yùn)行的比較slow首繁,可以手動將這個(gè)文件改為MRC環(huán)境,操作如圖陨囊。做完之后弦疮,編譯沒有問題了。


    解壓目錄.png
MRC操作.png

2.2數(shù)據(jù)接口的實(shí)現(xiàn)

+ (AppScene *)sharedInstance {
    static dispatch_once_t predicate;
    dispatch_once(&predicate, ^{
        appScene = (AppScene *)AppSceneString;
        appScene = [[AppScene alloc] init];
    });
    //防止子類使用
    if (![NSStringFromClass([self class]) isEqualToString:AppSceneString]) {
        NSParameterAssert(nil);
    }

    return appScene;
}

#pragma mark - private

- (instancetype)init {
    NSString *string = (NSString *)appScene;
    if ([string isKindOfClass:[NSString class]] == YES && [string isEqualToString:AppSceneString]) {
        self = [super init];
        if (self) {
            // 防止子類使用
            NSString *classString = NSStringFromClass([self class]);
            if (![classString isEqualToString:AppSceneString]) {
                NSParameterAssert(nil);
            }
        }
        return self;
    } else {
        return nil;
    }
}

  • 數(shù)據(jù)序列化接口的實(shí)現(xiàn)
- (void)serializeValue:(id)value withKey:(NSString *)key {
    NSParameterAssert(value);
    NSParameterAssert(key);
    //fastCoding是用來地點(diǎn)系統(tǒng)的NSCoding的協(xié)議 
    //可以將對象序列化成NSData,也可以反序列化對象
    NSData *data = [FastCoder dataWithRootObject:value];
    if (data) {
        [[NSUserDefaults standardUserDefaults] setObject:data forKey:key];
    }
}
  • 數(shù)據(jù)反序列化接口的實(shí)現(xiàn)
- (id)deserializeValueWithKey:(NSString *)key {
    NSParameterAssert(key);
    
    NSData *data = [[NSUserDefaults standardUserDefaults] valueForKey:key];
    return [FastCoder objectWithData:data];
}

3.在單例提供接口的基礎(chǔ)上進(jìn)行上層封裝


3.1編寫NSObject的category(storeValue)压语,如圖所示

category.png

3.2category的實(shí)現(xiàn)

- (void)serializeValueWithKey:(NSString *)key {
    
    [[AppScene sharedInstance] serializeValue:self withKey:key];
}

+ (id)deserializeValueWithKey:(NSString *)key {
    
    return [[AppScene sharedInstance] deserializeValueWithKey:key];
}

3.3封裝的優(yōu)點(diǎn)

隔離所有細(xì)節(jié)闲先,假設(shè)以后更改實(shí)現(xiàn)方法,原有代碼無需更改无蜂。

4測試


4.1測試結(jié)果OK伺糠,如圖

測試結(jié)果.png

4.2測試代碼,可以感受封裝優(yōu)點(diǎn)

- (void)test1 {
    [[AppScene sharedInstance] serializeValue:@{@"A":@"B"} withKey:@"test"];
    NSLog(@"------------test1------------");
    NSLog(@"%@", [[AppScene sharedInstance] deserializeValueWithKey:@"test"]);
}

- (void)test2 {
    Dog *dog = [[Dog alloc] init];
    dog.name = @"旺財(cái)";
    dog.identify = @{@"color" : @"black", @"weight" : @"20kg", @"height" : @"50cm"};
    
    [[AppScene sharedInstance] serializeValue:dog withKey:dog.name];
    NSLog(@"-----------test2-------------");
    Dog *wangcai = [[AppScene sharedInstance] deserializeValueWithKey:@"旺財(cái)"];
    NSLog(@"%@", wangcai.identify);
}

//test3在test2的基礎(chǔ)上增加了category,在單例提供接口的基礎(chǔ)上進(jìn)行上層封裝斥季,隔離所有細(xì)節(jié)
- (void)test3 {
    Dog *dog = [[Dog alloc] init];
    dog.name = @"旺旺";
    dog.identify = @{@"color" : @"red", @"weight" : @"30kg", @"height" : @"60cm"};

    [dog serializeValueWithKey:dog.name];
    NSLog(@"-----------test3-------------");
    Dog *wangwang = [Dog deserializeValueWithKey:@"旺旺"];
    NSLog(@"%@", wangwang.identify);

}

總結(jié)

  1. 單例實(shí)現(xiàn)训桶,便于管理,上層封裝酣倾,代碼簡潔舵揭;
  2. 實(shí)現(xiàn)簡單,代碼量較性晡午绳;
  3. 單獨(dú)創(chuàng)建的plist,方便其他頁面打tag映之。
    (注:最好不要在項(xiàng)目文件的info.plist中加入非必要的信息)
  4. github用單例模式優(yōu)化本地存儲示例代碼
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末拦焚,一起剝皮案震驚了整個(gè)濱河市蜡坊,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌赎败,老刑警劉巖秕衙,帶你破解...
    沈念sama閱讀 222,729評論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異僵刮,居然都是意外死亡据忘,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,226評論 3 399
  • 文/潘曉璐 我一進(jìn)店門搞糕,熙熙樓的掌柜王于貴愁眉苦臉地迎上來勇吊,“玉大人,你說我怎么就攤上這事窍仰∠舾#” “怎么了?”我有些...
    開封第一講書人閱讀 169,461評論 0 362
  • 文/不壞的土叔 我叫張陵辈赋,是天一觀的道長鲫忍。 經(jīng)常有香客問我,道長钥屈,這世上最難降的妖魔是什么悟民? 我笑而不...
    開封第一講書人閱讀 60,135評論 1 300
  • 正文 為了忘掉前任,我火速辦了婚禮篷就,結(jié)果婚禮上射亏,老公的妹妹穿的比我還像新娘。我一直安慰自己竭业,他們只是感情好智润,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,130評論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著未辆,像睡著了一般窟绷。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上咐柜,一...
    開封第一講書人閱讀 52,736評論 1 312
  • 那天兼蜈,我揣著相機(jī)與錄音,去河邊找鬼拙友。 笑死为狸,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的遗契。 我是一名探鬼主播辐棒,決...
    沈念sama閱讀 41,179評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了漾根?” 一聲冷哼從身側(cè)響起泰涂,我...
    開封第一講書人閱讀 40,124評論 0 277
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎立叛,沒想到半個(gè)月后负敏,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體贡茅,經(jīng)...
    沈念sama閱讀 46,657評論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡秘蛇,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,723評論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了顶考。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片赁还。...
    茶點(diǎn)故事閱讀 40,872評論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖驹沿,靈堂內(nèi)的尸體忽然破棺而出艘策,到底是詐尸還是另有隱情,我是刑警寧澤渊季,帶...
    沈念sama閱讀 36,533評論 5 351
  • 正文 年R本政府宣布朋蔫,位于F島的核電站,受9級特大地震影響却汉,放射性物質(zhì)發(fā)生泄漏驯妄。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,213評論 3 336
  • 文/蒙蒙 一合砂、第九天 我趴在偏房一處隱蔽的房頂上張望青扔。 院中可真熱鬧,春花似錦翩伪、人聲如沸微猖。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,700評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽凛剥。三九已至,卻和暖如春轻姿,著一層夾襖步出監(jiān)牢的瞬間当悔,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,819評論 1 274
  • 我被黑心中介騙來泰國打工踢代, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留盲憎,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 49,304評論 3 379
  • 正文 我出身青樓胳挎,卻偏偏與公主長得像饼疙,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,876評論 2 361

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

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,331評論 25 707
  • 單例模式(SingletonPattern)一般被認(rèn)為是最簡單窑眯、最易理解的設(shè)計(jì)模式屏积,也因?yàn)樗暮啙嵰锥琼?xiàng)目中最...
    成熱了閱讀 4,257評論 4 34
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法磅甩,類相關(guān)的語法炊林,內(nèi)部類的語法,繼承相關(guān)的語法卷要,異常的語法渣聚,線程的語...
    子非魚_t_閱讀 31,667評論 18 399
  • 晨起感恩 感恩諸佛菩薩三寶加持,感恩歷代祖先護(hù)佑僧叉,感恩天地滋養(yǎng)萬物奕枝,感恩父母養(yǎng)育之恩。 感恩早晨參加仁愛奉粥活...
    夏寧點(diǎn)點(diǎn)閱讀 156評論 0 0
  • 繼續(xù)說說三四章吧瓶堕,精神分析流派隘道,這可是心理學(xué)的基石,開山鼻祖郎笆。 弗洛伊德很早以前便聽說過谭梗,但開始翻閱源于近兩年的學(xué)...
    正念此心閱讀 193評論 1 1