最近在项目中优化了多图上传以及发布个人动态的功能,虽然也并没有很难,还是记录一下。
更新:中间有个版本我在App中使用的图片上传逻辑:选择完图片之后生成图片名称,生成图片名后在后台线程上传图片至OSS,该过程与心情发布可同时进行。但是后来在用户使用过程中,发现图片会有几率上传失败,但是之前未做任何处理,经检测失败原因可能是:
(1)、上传图片过程中杀死应用,导致上传线程被终止
(2)、上传图片过程中断网
因此后来采取了其他上传方式保证图片上传的成功率,最终所采用的上传方式是:
(1)、选择完图片之后生成图片名称。
(2)、图片名称为key,图片data作为value 存入缓存。
(3)、从缓存中读取图片名称及信息并上传,因为上传图片时是同步,每上传成功一张就从缓存中删除。
(4)、每次应用启动或者监测网络重新连接时去缓存中读取是否有图片需要上传。
我自己测试下来这种是可以避免已有的图片上传失败的问题的。
如果大家有什么其他好的方法也可以告知我,感谢!
自己项目中的发布个人动态功能(类似于微信朋友圈,可发文字、图片、动图)速度贼慢(在带有图片时整个发布过程长达几秒钟,这对于用户来说肯定是无法忍受的),因此需要对这一块儿进行优化。说实话,刚开始领导的要求只是把图片上传由刚开始的先上传到公司服务器再由后台传到阿里云 改为 直接由移动端上传到阿里云,我也以为就这么简单,结果,在看了OSS的文档并在移动端集成了上传功能,而且上传前使用 UIImageJPEGRepresentation 压缩图片,并使用以下代码简单改了图片尺寸,但最后发现事情并没有那么简单,体验仍然是灾难级别的。
图 1对比微信朋友圈,作为第一大社交应用,微信在性能优化方面真的是极尽所能,刚开始在网上搜了关于微信朋友圈机制的文章,微信朋友圈千亿访问量背后的技术挑战和实践总结,当然这篇是没有太大作用的,还有就是微信关于图片压缩的逻辑,这个是看其他大神博客总结的张小龙演讲的内容。其实对于朋友圈多图上传的逻辑,拿自己手机微信在联网和断网情况下多测几次,大概能猜出来。朋友圈在无网状态下,也是可以发布动态的,自己也可以看到,但是其他人是看不到的,在重新联网后,过一会儿,其他人就可以看到了。结合网上查到的资料,逻辑大概是用户在点击发布之后新建一条副本,给用户第一时间显示的是副本数据,后台开辟线程默默上传(断网状态下停止,联网状态下开始上传),当然内部逻辑肯定不会这么简单,但是按照这个逻辑我们基本可以写出来一个体验相对好的发布功能了。
图 2 -微信朋友圈图片上传压缩机制有了思路,接下来就是怎么实现的问题了。想着逻辑很简单,但是在写起来时还是费了不少时间的,因为要去考虑 多张图片异步上传、图片上传成功后取到图片URL发布动态、硬盘存储的多个副本数据的上传(一条副本数据相当于一条动态)等多个操作,在考虑之后我自己规定了操作之间的关系,大致为 多图上传采用异步请求,发布动态使用AFNetworking所以肯定是异步请求,而上传图片和发布动态之间,我使用的是同步请求,因为我想在发布动态的时候就确保图片已经上传成功了,当然也可以采用异步,因为图片名称是自己定义的,域名也都是已知的,直接可以拿到url,但是里面有些细节我没考虑好,所以暂不说异步。说回同步,想到这里的时候突然想起了之前去途牛面试的时候问到的一个问题,两个异步请求,但是希望两者间是个同步关系,怎么处理? 可能很多人都知道,我是查过之后才知道的,使用 dispatch_semaphore_t(信号量)关于信号量有很多讲解的文章,这里就不赘述了。简单说类似于设置资源量然后进行加锁。 然后就是多个动态发布操作之间的关系,也是同步。不然有可能造成多个副本中图片的混乱。
网友评论