【iOS开发-从网络上获取图片尺寸】
2016-03-18 23:51
357 查看
实际开发过程中,容易碰到从网络上获取图片尺寸的场景,比如一个UIImageView要装载从网络上获取的图片,但要先设置其frame,此时又不知道图片尺寸,就要从网络上获取尺寸了。为了最好的用户体验,一般最好由服务器返回图片尺寸参数。
但因特殊原因,服务器无法提供的,就需要自己先将图片下载到本地,再从本地获取图片尺寸了。但问题在于,图片下载是是耗时操作,等图片下载完成后,在拿到图片的尺寸设置控件的frame,这样会让界面看起来非常卡。为了解决这个问题,我们可以开启子线程,异步获取图片。(主线程继续加载UI控件,子线程下载图片),等子线程下载完毕后,再回到主线程中刷新UI。
但因特殊原因,服务器无法提供的,就需要自己先将图片下载到本地,再从本地获取图片尺寸了。但问题在于,图片下载是是耗时操作,等图片下载完成后,在拿到图片的尺寸设置控件的frame,这样会让界面看起来非常卡。为了解决这个问题,我们可以开启子线程,异步获取图片。(主线程继续加载UI控件,子线程下载图片),等子线程下载完毕后,再回到主线程中刷新UI。
// 创建串行队列(因为在子线程中,要将每个图片的尺寸按顺序加到模型数组中,故使用串行队列) dispatch_queue_t queue = dispatch_queue_create("cn.xxx.queue", DISPATCH_QUEUE_SERIAL); [prodetailUrl enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) { // 开启异步函数,获取下载图片,获取尺寸 dispatch_async(queue, ^{ NSData *data = [NSData dataWithContentsOfURL:[NSURL URLWithString:obj]]; UIImage *image = [UIImage imageWithData:data]; CGSize imgSize = [image getSize]; [weakSelf.DetialImgHeigths addObject:@(imgSize.height)]; [weakSelf.DetialImgWides addObject:@(imgSize.width)]; // 回到主线程执行 dispatch_sync(dispatch_get_main_queue(), ^(){ [weakSelf.tb reloadData]; [weakSelf.detailtb reloadData]; }); }); }];
相关文章推荐
- 【Web】写个HTML页面去调试HTTP接口方便些
- 在 Tomcat 中配置 SSL/TLS 以支持 HTTPS
- Android网络编程之UDP/TCP
- HTTPS 初解
- 抛出异常与栈展开(stack unwinding) http://www.cnblogs.com/zhuyf87/archive/2012/12/23/2829725.html
- 网络传输的本质(buffer传输)决定了序列化和反序列化的重要应用
- 树莓派没有显示器时的网络连接
- Genymotion添加模拟器时报“Unable to create virtual device,Server returned HTTP status code 0”
- Java 被访问时报 the method getDispatcherType() is undefined for the type HttpServletRequest
- centos7 无线网卡驱动的安装及无线网络的配置
- Linux网络流量监控与分析工具Ntopng
- FEC(Forward Error Correction)前向纠错 UDP\RTP 中使用用于改善无线等网络丢包等问题
- 高效地配置okhttp
- bzoj 2816: [ZJOI2012]网络(splay)
- Android好用的okhttp网络封装(get,post,上传,下载)
- http协议(2)
- 极路由的“802.1x手机号登陆wifi”插件,电脑连接wifi方法
- TCP/IP协议栈
- http status 400,http 400,400 错误
- 1570: [JSOI2008]Blue Mary的旅行|网络流