一熔脂、前言
看到標(biāo)題,也許你第一反應(yīng)可能是蓖乘,在開發(fā)中哪會(huì)把HUD添加到keyWindow上锤悄。但在實(shí)際情況是韧骗,有時(shí)候會(huì)在VC里把HUD添加到keyWindow上嘉抒;也有些同學(xué)的項(xiàng)目,為了方便網(wǎng)絡(luò)處理袍暴,把HUD直接放在網(wǎng)絡(luò)請(qǐng)求層了些侍,因?yàn)榫W(wǎng)絡(luò)請(qǐng)求層不把VC或者view傳進(jìn)來,一般拿不到view政模,很多時(shí)候岗宣,可能就會(huì)這么寫
UIView *view = [UIApplication sharedApplication].keyWindow;
從而把HUD添加到keyWindow上。這里并不是說這種做法好淋样,這么做把網(wǎng)絡(luò)邏輯和UI耦合在了網(wǎng)絡(luò)層耗式,本身就是不利于單元測(cè)試的。但在實(shí)際中趁猴,確實(shí)有同學(xué)這么做了刊咳。我這里只從HUD添加到keyWindow會(huì)產(chǎn)生哪些問題說說自己的想法,有不對(duì)的地方儡司,還忘指出娱挨。
二、正文
備注:以下討論的前提均是把HUD添加到keyWindow上
(一)第一種情況:加載菊花時(shí)捕犬,用戶不可操作跷坝。
這種情況有個(gè)很大的壞處,就是剝奪了用戶的控制權(quán)碉碉,用戶體驗(yàn)很不好柴钻。有些時(shí)間網(wǎng)絡(luò)信號(hào)比較差的時(shí)候,或者讀取本地?cái)?shù)據(jù)比較大的時(shí)候(比如讀取通訊錄)垢粮,可能用戶不想等待當(dāng)前界面加載完成了贴届,想返回去,或者進(jìn)行一下其他操作。但是這時(shí)候菊花時(shí)加載到keyWindow上的粱腻。用戶也許就只能一味的等待了庇配。
(二)第二種情況:加載菊花時(shí),用戶可操作绍些。
這種情況不會(huì)剝奪用戶控制權(quán)捞慌。但也導(dǎo)致了額外的狀態(tài)代碼。例如
這是沒有添加任何額外狀態(tài)控制代碼的效果柬批。從上一個(gè)界面返回來啸澡,菊花依舊在界面上,原因也很簡(jiǎn)單氮帐,就是因?yàn)榫栈〞r(shí)添加到keyWindow上的嗅虏。要解決這個(gè)問題,可能就要添加類似這樣的狀態(tài)控制代碼上沐。
- (void)viewWillDisappear:(BOOL)animated { [super viewWillDisappear:animated]; if (self.isShowHudInKeyWindow) { [MBProgressHUD hideHUDForView:[UIApplication sharedApplication].keyWindow animated:true]; } }
總結(jié)
無論是以上哪種情況皮服,如果菊花是添加到keyWindow上的,比如前面說到的網(wǎng)絡(luò)層添加菊花的情況参咙,因?yàn)楹苡锌赡躠pp會(huì)在短時(shí)間進(jìn)行多個(gè)網(wǎng)絡(luò)請(qǐng)求龄广,如此一來,問題就很明顯了蕴侧,往keyWindow上添加了多個(gè)菊花择同,
雖然表面效果沒什么問題,但實(shí)際就是埋下了一個(gè)雷净宵。如果我們把菊花加在VC的view上敲才,往往就能避免很多問題。當(dāng)view狀態(tài)改變了择葡,HUD也會(huì)跟著改變(因?yàn)镠UD是添加到view上的)紧武,比如,push再pop的效果刁岸。另一方面脏里,因?yàn)檫@時(shí)候HUD的生命周期是受view控制的,而VC又控制了view的生命周期虹曙,當(dāng)VC釋放了迫横,菊花也就自然跟著釋放了。由此可見酝碳,會(huì)省掉很多狀態(tài)控制的代碼矾踱。
題后
demo地址:https://github.com/Calvix-Xu/HUDNotToKeyWindowDemo.git
demo使用的是MBProgressHUD。