進階篇第六期:我稱它為“交互式開發思想” -开发者知识库
最近一直在做項目,在項目中呢也遇到了某些問題,比如為一個狀態點贊或者是踩,那么按鈕的狀態會隨之改變,但是這個過程是要發送請求的,也就是說我們要在請求回來以后才改變狀態,於是小弟就有了一個大膽的想法,那么我的這個想法呢,就是以交互為主,開發邏輯為輔,讓交互設計融入開發代碼之中,所以我稱它為:交互式開發思想,希望可以幫助小伙伴哦
主要就是下面這兩個圖的效果,也就是點擊的時候讓它有反應,當請求過后還要再次回調進來,比如請求成功,我們就不用改變它的狀態,但是請求失敗,我們就要將原來的狀態改變,而我們正常的做法其實是點擊的時候有一個動畫出來,然后請求成功后,狀態改變,失敗,則狀態不變,對應Label上的數字的值也不做改變,但為了方便一點,就沒有做動畫
廢話不多說,先看代碼
這里的難點在於如何巧妙的運用Delegate以及Block來做這些事情,那么我們就先定義一個Block吧
typedef void(^ButtonBlock)(BOOL isChanged);
然后寫一個Delegate,然后在方法里面添加Block當參數
- (void)tableViewCell:(SWHTableViewCell *)cell didTappedButton:(UIButton *)button block:(ButtonBlock)block;
有些時候寫代碼為什么要分好模塊,就是因為我們要遵循MVC的架構模式,這樣將代碼的耦合度降到最低,也方便我們后期對其很好的維護,對於代碼質量相關的帖子,我會每個月更新一次的哦
接下來我們來看看在Up按鈕事件里面要做的事情
- (void)upActionButton:(UIButton *)button { if ([self isButtonTypeChanged]) { return; } [button setBackgroundColor:[UIColor redColor]]; [self.model setButtonUpType:SWHButtonTypeUp]; [self.numLabel setText:[NSString stringWithFormat:@"%ld", self.model.num]]; __weak SWHTableViewCell *weakSelf = self; if ([self.delegate respondsToSelector:@selector(tableViewCell:didTappedButton:block:)]) { [self.delegate tableViewCell:self didTappedButton:button block:^(BOOL isChanged) { }]; }}
接下來我們用一個假數據來模仿一次網絡請求,我這里用的是delay方法
- (BOOL)delayRequest { NSInteger num = random() % 2; if (num) { NSLog(@"請求網絡成功"); return YES; } NSLog(@"請求網絡失敗"); return NO;}
接下來我們再利用delay方法里面的返回值來改寫這個block參數
- (void)tableViewCell:(SWHTableViewCell *)cell didTappedButton:(UIButton *)button block:(ButtonBlock)block { __weak ViewController *weakSelf = self; __block ButtonBlock newBlock = block; dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ newBlock([weakSelf delayRequest]); });}
然后我們再根據參數來回調block到UpAction里面,所有的Cell相關的UI都要放在Cell里面來做
__weak SWHTableViewCell *weakSelf = self; if ([self.delegate respondsToSelector:@selector(tableViewCell:didTappedButton:block:)]) { [self.delegate tableViewCell:self didTappedButton:button block:^(BOOL isChanged) { if (!isChanged) { [button setBackgroundColor:[UIColor yellowColor]]; [weakSelf.numLabel setText:[NSString stringWithFormat:@"%ld", --weakSelf.model.num]]; [weakSelf.model setButtonUpType:SWHButtonTypeNone]; } }]; }
沒錯,你會發現,這樣會把耦合度降到最低
在下一期的代碼質量提高的帖子里面,我會將這期的大部分代碼寫進去,讓我們任性的提高我們的代碼質量,而不是惰性的提高它們哦
如有任何技術相關的問題,請來群里提問並分享,讓我們一起任性的進步
本文出自 “東軟iOS校友群的技術博客” 博客,請務必保留此出處http://neusoftios.blog.51cto.com/9977509/1635771
最佳答案: