把HUD(菊花)添加到KeyWindow也许并不是好事

一、前言

看到标题,也许你第一反应可能是,在开发中哪会把HUD添加到keyWindow上。但在实际情况是,有时候会在VC里把HUD添加到keyWindow上;也有些同学的项目,为了方便网络处理,把HUD直接放在网络请求层了,因为网络请求层不把VC或者view传进来,一般拿不到view,很多时候,可能就会这么写
UIView *view = [UIApplication sharedApplication].keyWindow;
从而把HUD添加到keyWindow上。这里并不是说这种做法好,这么做把网络逻辑和UI耦合在了网络层,本身就是不利于单元测试的。但在实际中,确实有同学这么做了。我这里只从HUD添加到keyWindow会产生哪些问题说说自己的想法,有不对的地方,还忘指出。

二、正文

备注:以下讨论的前提均是把HUD添加到keyWindow上

(一)第一种情况:加载菊花时,用户不可操作。

这种情况有个很大的坏处,就是剥夺了用户的控制权,用户体验很不好。有些时间网络信号比较差的时候,或者读取本地数据比较大的时候(比如读取通讯录),可能用户不想等待当前界面加载完成了,想返回去,或者进行一下其他操作。但是这时候菊花时加载到keyWindow上的。用户也许就只能一味的等待了。

(二)第二种情况:加载菊花时,用户可操作。

这种情况不会剥夺用户控制权。但也导致了额外的状态代码。例如

Slice 1.png

这是没有添加任何额外状态控制代码的效果。从上一个界面返回来,菊花依旧在界面上,原因也很简单,就是因为菊花时添加到keyWindow上的。要解决这个问题,可能就要添加类似这样的状态控制代码。
- (void)viewWillDisappear:(BOOL)animated { [super viewWillDisappear:animated]; if (self.isShowHudInKeyWindow) { [MBProgressHUD hideHUDForView:[UIApplication sharedApplication].keyWindow animated:true]; } }

总结

无论是以上哪种情况,如果菊花是添加到keyWindow上的,比如前面说到的网络层添加菊花的情况,因为很有可能app会在短时间进行多个网络请求,如此一来,问题就很明显了,往keyWindow上添加了多个菊花,
虽然表面效果没什么问题,但实际就是埋下了一个雷。如果我们把菊花加在VC的view上,往往就能避免很多问题。当view状态改变了,HUD也会跟着改变(因为HUD是添加到view上的),比如,push再pop的效果。另一方面,因为这时候HUD的生命周期是受view控制的,而VC又控制了view的生命周期,当VC释放了,菊花也就自然跟着释放了。由此可见,会省掉很多状态控制的代码。

题后

demo地址:https://github.com/Calvix-Xu/HUDNotToKeyWindowDemo.git
demo使用的是MBProgressHUD。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 12,301评论 4 61
  • Swift版本点击这里欢迎加入QQ群交流: 594119878最新更新日期:18-09-17 About A cu...
    ylgwhyh阅读 25,655评论 7 249
  • 今天是二零一七年三月二十八日,很快就到二十九日了。 不知道别人的大学是怎样的,我完全是在紧张又无为中度过的...
    江永阅读 209评论 1 0
  • 今天我又复习了一遍笑来老师《通往财富自由之路》专栏里面你应该拥有最重要的能力是什么?答案就是元认知能力。元认知能力...
    小西伯利亚狼阅读 199评论 0 0