Onelong

分享知识,与你一起进步......
RSS icon Home icon
  • 网络处理经验

    post by onelong / 2016-8-7 15:32 Sunday [工作]

    最近在升级网络库,从AFN 2.6.3升级到AFN 3.1,发现了导致了很多问题,之前在2.6.3很多显示使用了GCD处理的,升级之后出现了问题,导致下拉控件死锁无法收回。在各自的控件内,好难调试找出问题,很多时候靠经验推测。从SDWebImage 3.7.6 到3.8.1,同样导致一些以前可以显示地方现在不能显示了,3.8开始使用了URLSession,放弃了之前的NSOperation+urlconnection,之前很多可以通知更新UI的地方,现在出现了效率很低的问题。尽管在UITableView上面没什么问题,原因是UITableView是自动刷新界面的,而不是通知的。对于UITableView还在努力使用懒加载,尽可能在滑动的时候不加载UI,停下来的时候加载可见空间的UI,理论上这个是最高效率的,可以减少没有必要的请求,尽管系统控制了网络请求的并发,但是多余的请求在等待队列里面肯定会增大等待时间的,这个做法在网上可以找到参考方案。现在GCD用得很频繁,但是也不要过分使用,尤其在不够清楚原理的时候,一旦出现随机问题,调试会相当痛苦。URLSession默认情况响应都是在主线程调用,然后你又在它的回调里面搞个同步的东东,马上挂了。
    AFN默认maxConcurrentOperationCount是1,也就是单个队列的并发是1,在iOS的网络配置里面还有一个参数可以配置的,HTTPMaximumConnectionsPerHost,默认是4。我的理解是4个client客户端的意思,全局理解呢,就是手机进程默认启动4个http client,每个http client都自己并发队列,默认是串行(先进先出)的。我在案场的项目无意配置了HTTPMaximumConnectionsPerHost=1,默认maxConcurrentOperationCount=1,在多请求的界面上比android慢了很多,也是经历这次,我才意识到之前对参数不理解。优化后HTTPMaximumConnectionsPerHost=4,maxConcurrentOperationCount=4,客户再也没有说慢的问题了。同样的配置,在另外的项目出现了很奇怪的问题,例如下拉无法收回。虽然我没有修改配置测试,只是注释掉那些GCD的代码就没有问题了,我在猜想如果将maxConcurrentOperationCount配置为默认值就应该没有问题了,下次闲着的时候再试一试吧。
    以同样的原理,在案场项目里面做了退出界面,关闭无用的网络连接也是一种优化网络的手段。
    说完网络, 我说说别的吧,这周做了个在Tableview cell支持多行输入的东西,这个东西让我了解到Tableview不一样的地方,使用beginUpdate,endUpdate可以不reload cell刷新行高,效率非常明显。无论是使用Autolayout还是绝对坐标,只有你明白其中奥秘,都可以顺利的实现想要的效果。
    折腾了那么多,我觉得现在是有必要认真的阅读一些开源库的代码了,例如AFN,SDWebImage,虽然我之前看过好几个网络和缓存的开源项目,但是没有在项目里面经过高强度的测试,感触还是比较少的,都是基于理论的理解,而并非在经验层面上理解。朋友说他们的项目有5w多用户,我觉得这点上还是蛮有意思的。曾经有点冲动想去优化那个20多w用户的android app,后来想想,要是这个在过年放假的时候,我估计还是会弄下来的。我一直喜欢做点有挑战的事情,在工作中看到不好的,我都会想办法优化掉,虽然过程比较累,比较折腾,甚至熬夜,但是我觉得一切都是值得的。一个人的经验,靠听说的,靠看到的,肯定不够靠谱,自己亲身经历的才是实实在在的自信和实力。工作也好,生活也罢,努力去让自己问心无愧,努力让我自己觉得不是在浪费生命,而是在进步。一个人,无论在百度,还是腾讯,甚至在创业公司,你想得更多,都得靠着自己付出,指望不了别人引导你,帮助你。在BAT工作的人,本身工作量就大,谁也没有时间去管你,就是有时间,有时候也不好意思叫你学这个,学那个,毕竟每个人都有自己的私人空间和发展方向。
    成长和机会都靠自己争取的。

    引用地址:
     

    我要评论