全局?jǐn)?shù)據(jù)同步(二)UI篇

上次討論了如何讓數(shù)據(jù)全局同步棕洋,但是在同步到UI層的時(shí)候還是有些麻煩《锾蓿現(xiàn)在來解決UI層的問題把沼。

之前的方案有兩種:

  1. 在viewWillAppear的時(shí)候,reloadData秩伞,缺點(diǎn)是如果需要reload的數(shù)據(jù)太多逞带,大量計(jì)算會(huì)導(dǎo)致阻塞主線程,雖然可能沒有那么嚴(yán)重纱新,但是有些時(shí)候還是能夠感知出來掰担。
  2. 使用KVO來監(jiān)聽變化,缺點(diǎn)是代碼侵入性太強(qiáng)怒炸,而且嚴(yán)重影響了一些代碼的統(tǒng)一性带饱。

下面是使用KVO的一個(gè)例子:

@weakify(self);
[self.KVOController observe:_record keyPath:NSStringFromSelector(@selector(praiseCount)) options:NSKeyValueObservingOptionNew block:^(id  _Nullable observer, MZRecord *object, NSDictionary<NSString *,id> * _Nonnull change) {
      @strongify(self);
      self.recordTabbar.praiseCount = object.praiseCount;
}];
[self.KVOController observe:_record keyPath:NSStringFromSelector(@selector(praised)) options:NSKeyValueObservingOptionNew block:^(id  _Nullable observer, MZRecord *object, NSDictionary<NSString *,id> * _Nonnull change) {
     @strongify(self);
     [self.recordTabbar setPraised:object.isPraised animated:self.view.window != nil];
}];
[self.KVOController observe:_record keyPath:NSStringFromSelector(@selector(collected)) options:NSKeyValueObservingOptionNew block:^(id  _Nullable observer, MZRecord *object, NSDictionary<NSString *,id> * _Nonnull change) {
    @strongify(self);
    [self.recordTabbar setCollected:object.collected animated:self.view.window != nil];
}];
[self.KVOController observe:_record keyPath:NSStringFromSelector(@selector(collectCount)) options:NSKeyValueObservingOptionNew block:^(id  _Nullable observer, MZRecord *object, NSDictionary<NSString *,id> * _Nonnull change) {
    @strongify(self);
    self.recordTabbar.collectCount = object.collectCount;
}];
[self.KVOController observe:_record keyPath:NSStringFromSelector(@selector(commentCount)) options:NSKeyValueObservingOptionNew block:^(id  _Nullable observer, MZRecord *object, NSDictionary<NSString *,id> * _Nonnull change) {
    @strongify(self);
    self.recordTabbar.commentCount = object.commentCount;
}];

上面是我們?yōu)榱送?個(gè)按鈕的狀態(tài)的代碼,我們使用了一個(gè)第三方庫(kù)來簡(jiǎn)化KVO的編寫阅羹,但還是非常的冗余勺疼。

為此,開始思考有什么更簡(jiǎn)單的方法捏鱼。

開始我們想要封裝KVO执庐,直接綁定數(shù)據(jù)和UI,但是很多數(shù)據(jù)并不是一一對(duì)應(yīng)的导梆,比如數(shù)字轨淌,狀態(tài)迂烁,是需要轉(zhuǎn)化的,而且狀態(tài)變更很多情況下是需要?jiǎng)有У牡蒺模詿o論如何都不免不了監(jiān)聽和轉(zhuǎn)換這兩個(gè)東西盟步。

后來想,既然數(shù)據(jù)可以做全局同步躏结,那么是否可以把視圖也看作一種類型的資源却盘,也自動(dòng)同步該狀態(tài)屬性呢?按照這種思路媳拴,將視圖改寫支持這種方式來同步黄橘。

@interface UIView (MZChannel) <MZChannelProtocol>
// 我們需要在創(chuàng)建的時(shí)候就確定類型,而且不能修改屈溉,防止意料之外的情況
- (instancetype)initWithFrame:(CGRect)frame channelType:(NSInteger)channelType;
// 加入數(shù)據(jù)池中塞关,并且內(nèi)部增加了lock,保證線程安全
- (void)bindId:(NSString *)id;
// 為了避免與view自身屬性沖突子巾,增加了一個(gè)白名單配置
- (NSArray<NSString *> *)channelWhiteList;
@end

查看一下我們修改之后的狀態(tài)

// RecordTabbar
// 新增這兩個(gè)方法帆赢,由于之前設(shè)計(jì)中的接口與該keyPath統(tǒng)一,所以其他內(nèi)容不需要修改
- (NSInteger)channelType {
    return MZResourceTypeNote;
}

- (NSArray<NSString *> *)channelWhiteList {
    return @[NSStringFromSelector(@selector(praised)),
             NSStringFromSelector(@selector(praiseCount)),
             NSStringFromSelector(@selector(collected)),
             NSStringFromSelector(@selector(collectCount)),
             NSStringFromSelector(@selector(commentCount))];
}
// 部分對(duì)應(yīng)的setter方法
- (void)setPraised:(BOOL)praised {
    _praised = praised;
    [self.praiseButton setPraised:praised animated:self.window != nil];
}

- (void)setPraised:(BOOL)praised animated:(BOOL)animated {
    _praised = praised;
    [self.praiseButton setPraised:praised animated:animated];
}

- (void)setPraiseCount:(NSInteger)praiseCount {
    _praiseCount = praiseCount;
    self.praiseButton.praiseCount = praiseCount;
}

- (void)setCollected:(BOOL)collected {
    [self setCollected:collected animated:self.window != nil];
}

由于該頁(yè)面資源id并不會(huì)變化砰左,所以只需要在初始化的時(shí)候綁定一次id就可以了匿醒。

[self.recordTabbar bindId:self.record.id];

這樣我們的后半部分流程(從數(shù)據(jù)到顯示)也完整了场航,整個(gè)流程都依賴于MZChannel進(jìn)行缠导。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市溉痢,隨后出現(xiàn)的幾起案子僻造,更是在濱河造成了極大的恐慌,老刑警劉巖孩饼,帶你破解...
    沈念sama閱讀 222,183評(píng)論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件髓削,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡镀娶,警方通過查閱死者的電腦和手機(jī)立膛,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,850評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來梯码,“玉大人宝泵,你說我怎么就攤上這事⌒ⅲ” “怎么了儿奶?”我有些...
    開封第一講書人閱讀 168,766評(píng)論 0 361
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)鳄抒。 經(jīng)常有香客問我闯捎,道長(zhǎng)椰弊,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,854評(píng)論 1 299
  • 正文 為了忘掉前任瓤鼻,我火速辦了婚禮秉版,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘娱仔。我一直安慰自己沐飘,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,871評(píng)論 6 398
  • 文/花漫 我一把揭開白布牲迫。 她就那樣靜靜地躺著耐朴,像睡著了一般。 火紅的嫁衣襯著肌膚如雪盹憎。 梳的紋絲不亂的頭發(fā)上筛峭,一...
    開封第一講書人閱讀 52,457評(píng)論 1 311
  • 那天,我揣著相機(jī)與錄音陪每,去河邊找鬼影晓。 笑死,一個(gè)胖子當(dāng)著我的面吹牛檩禾,可吹牛的內(nèi)容都是我干的挂签。 我是一名探鬼主播,決...
    沈念sama閱讀 40,999評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼盼产,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼饵婆!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起戏售,我...
    開封第一講書人閱讀 39,914評(píng)論 0 277
  • 序言:老撾萬榮一對(duì)情侶失蹤侨核,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后灌灾,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體搓译,經(jīng)...
    沈念sama閱讀 46,465評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,543評(píng)論 3 342
  • 正文 我和宋清朗相戀三年锋喜,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了些己。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,675評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡嘿般,死狀恐怖段标,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情博个,我是刑警寧澤怀樟,帶...
    沈念sama閱讀 36,354評(píng)論 5 351
  • 正文 年R本政府宣布,位于F島的核電站盆佣,受9級(jí)特大地震影響往堡,放射性物質(zhì)發(fā)生泄漏械荷。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,029評(píng)論 3 335
  • 文/蒙蒙 一虑灰、第九天 我趴在偏房一處隱蔽的房頂上張望吨瞎。 院中可真熱鬧,春花似錦穆咐、人聲如沸颤诀。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,514評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)崖叫。三九已至,卻和暖如春拍柒,著一層夾襖步出監(jiān)牢的瞬間心傀,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,616評(píng)論 1 274
  • 我被黑心中介騙來泰國(guó)打工拆讯, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留脂男,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 49,091評(píng)論 3 378
  • 正文 我出身青樓种呐,卻偏偏與公主長(zhǎng)得像宰翅,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子爽室,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,685評(píng)論 2 360

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

  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫(kù)汁讼、插件、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 12,121評(píng)論 4 61
  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,304評(píng)論 25 707
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理肮之,服務(wù)發(fā)現(xiàn)掉缺,斷路器卜录,智...
    卡卡羅2017閱讀 134,708評(píng)論 18 139
  • 類的Static代碼塊,也就是靜態(tài)代碼塊,只會(huì)執(zhí)行一次戈擒,是在類被加載的時(shí)候執(zhí)行。因?yàn)槊總€(gè)類只會(huì)被加載一次艰毒,所以靜態(tài)...
    af4e8a35bc89閱讀 799評(píng)論 0 0
  • 所謂悲劇之二:一是不懂戲的小生毫無準(zhǔn)備地上臺(tái)筐高,倉(cāng)促之下勇敢面對(duì),而對(duì)白開始時(shí)卻發(fā)現(xiàn)他拿錯(cuò)了劇本丑瞧;再個(gè)是一筆一劃寫好...
    嵐風(fēng)的葉子閱讀 135評(píng)論 0 0