iOS 開發(fā)中界面層與網(wǎng)絡(luò)相關(guān)的部分通用功能的的設(shè)計
這里網(wǎng)絡(luò)請求庫是指AFNetworking, 它實際上也是現(xiàn)在iOS開發(fā)中最主流的庫站宗。
界面開發(fā)中和網(wǎng)絡(luò)相關(guān)的请契,通用的常常有這么兩個地方:
- 網(wǎng)絡(luò)請求時的活動指示器(UIActivityIndicatorView)顯示忠寻。在很多的應(yīng)用中煞躬,一旦網(wǎng)絡(luò)請求開始量淌,app就會顯示一個小菊花不停的轉(zhuǎn)動轻抱,網(wǎng)絡(luò)請求結(jié)束之后飞涂,小菊花消失。
當(dāng)然, 也有app使用了有比小菊花更精美復(fù)雜的動畫來表示網(wǎng)絡(luò)請求正在進(jìn)行祈搜。活動指示器, 有的也稱為加載動畫较店。
- 網(wǎng)絡(luò)請求開始后,需要禁用某些視圖或者控件的用戶交互; 請求結(jié)束后容燕,重新啟用界面或者控件的用戶交互梁呈。
比如你點擊某個按鈕來發(fā)布一條點評,這時候蘸秘,需要在請求結(jié)束之前禁用按鈕官卡,防止用戶再次點擊產(chǎn)生兩個同樣的點評。當(dāng)點評在服務(wù)器端創(chuàng)建成功或者失敗返回給客戶端之后, 按鈕再被重新啟用醋虏。
設(shè)計的目標(biāo):
簡化
減少重復(fù)工作寻咒。避免在所有的網(wǎng)絡(luò)請求的位置,都編寫顯示指示器顯示和消失的代碼颈嚼;減少禁用和啟用控件所需要編寫的代碼量毛秘。
松耦合
不能讓網(wǎng)絡(luò)層和界面層產(chǎn)生強耦合,如果在網(wǎng)絡(luò)層的代碼里阻课,出現(xiàn)了界面層的代碼叫挟,就將兩個層面的問題耦合關(guān)聯(lián)了。
實現(xiàn)思路
1 提供統(tǒng)一的網(wǎng)絡(luò)請求方法限煞。
2 增加所有網(wǎng)絡(luò)請求開始抹恳,結(jié)束兩個事件,讓相關(guān)對象能夠接收到消息署驻。
3 在界面層适秩,創(chuàng)建顯示指示器,停止指示器的方法硕舆,在網(wǎng)絡(luò)的訪問開始秽荞,訪問結(jié)束事件里調(diào)用。
4 創(chuàng)建一個集合抚官,用來存儲需要在網(wǎng)絡(luò)請求期間僅用扬跋,在網(wǎng)絡(luò)訪問結(jié)束之后啟用的視圖和控件。
5 在開始請求的事件里凌节,禁用所有在集合里的控件钦听,在開始網(wǎng)絡(luò)請求的時候洒试,將這些控件恢復(fù)啟用,并從集合中刪除朴上。
實現(xiàn)示例:
注意: 以下代碼僅供參考, 用來說明設(shè)計思路, 肯定不能拿來就用.
//網(wǎng)絡(luò)層代碼示例
@protocol QIHttpRequestDelegate
-(void) onRequestStart: …
-(void)
@end
@interface QIHttpManager...
@property(weak,noautomatic) id<QIHttpRequestDelegate> requestDelegate;
-(void) post:...;
…
@end
@@implementation
{
AFHTTPSessionManager* _httpManager;
}
-(void) post:…
{
…
if(_requestDelegate){
[_requestDelegate onRequestStart:…]
}
…
… [_httpManager POST:…
success:^(NSURLSessionDataTask *task, id responseObject) {
…
if(_requestDelegate){
[_requestDelegate onRequestStop:…]
}
…
}
failure:^(NSURLSessionDataTask *task, NSError *error) {
…
if(_requestDelegate){
[_requestDelegate onRequestStop:…]
}
…
}
…
}
…
@end
//界面層代碼示例
@interface QIUIManager:NSObject<QIHttpRequestDelegate>
@property(readonly) NSMutableSet* viewsNeedDisableWhileRequestingSet;
-(void) onRequestStart: …
{
[self startActivityIndicatorView];
for( View* v in _viewsNeedDisableWhileRequestingSet){
v.userInteractionEnabled=NO;
}
}
-(void) onRequestStop: …
{
[self stopActivityIndicatorView];
for( View* v in _viewsNeedDisableWhileRequestingSet){
v.userInteractionEnabled=TRUE;
}
}
@end
// 在app啟動的位置增加:
[QIHttpManager shareManager].requestDelegate=[QIUIManager shareManager];