Swift正在使用NSURLConnection异步下载同步(实例解析)
原版的blog。转载请注明出处
http://blog.csdn.net/hello_hwc
一、同步异步两个概念
简单来讲。同步就是函数或者闭包(objective c中的block)运行完成才干返回。
异步是立马返回,然后异步运行的动作结束后。再进行回调。
二、同步下载
同步下载:
class func sendSynchronousRequest(_ request: NSURLRequest,
returningResponse response:AutoreleasingUnsafeMutablePointer<NSURLresponse>
error error:NSErrorPointer)->NSdata?
參数:
request
要请求的URLRequest
reponse
回调參数,server返回的URL response
error 回调參数。推断是否有错误产生
下面下面载一张图片为例
能够发现。在view出现的时候。照片已经存在了,可是view加载较慢。由于要等待同步下载完毕
完整的代码:
class ViewController: UIViewController{
var imageview = UIImageView(frame: CGRectMake(40,40,200,200))
override func viewDidLoad(){
super.viewDidLoad()
imageview.contentMode = UIViewContentMode.ScaleAspectFit
self.view.addSubview(imageview)
let url = "http://f.hiphotos.baidu.com/image/pic/item/e1fe9925bc315c60191d32308fb1cb1348547760.jpg"
let imageURL = NSURL(string:url)
let urlRequest = NSURLRequest(URL: imageURL!)
var response:NSURLResponse?
var error:NSError?
var data = NSURLConnection.sendSynchronousRequest(urlRequest,returningResponse:&response,error:&error) as NSData?
if error == nil && data?.length > 0{
var image:UIImage = UIImage(data:data!)!
imageview.image = image
}
}
override func didReceiveMemoryWarning(){
super.didReceiveMemoryWarning()
}
}
三、异步下载
class func sendAsynchronousRequest(_ request: NSURLRequest,
queue:NSOperationQueue!
completionHandler handler:(NSURLResponse!,NSData!,NSError!))->Void
參数:
request
要请求的URLRequest
queue 当请求完毕或者出错的时候,闭包在这个队列上运行。更改UI要在主线程上运行
handler
当请求完毕或者出错的时候,运行的闭包
闭包的几个參数
reponse
回调參数,server返回的URL response
error 回调參数,推断是否有错误产生
NSData
下载到的数据
相同以一张图片为例
能够发现,view立马加载。可是图片不会立马出现。等到图片下载完了。UI会更新。
能够看到,异步下载不会堵塞UI,造成用户体验不好。
完整的代码
class ViewController: UIViewController{
var imageview = UIImageView(frame: CGRectMake(40,40,200,200))
override func viewDidLoad(){
super.viewDidLoad()
imageview.contentMode = UIViewContentMode.ScaleAspectFit
self.view.addSubview(imageview)
let url = "http://f.hiphotos.baidu.com/image/pic/item/e1fe9925bc315c60191d32308fb1cb1348547760.jpg"
let imageURL = NSURL(string:url)
let urlRequest = NSURLRequest(URL: imageURL!)
NSURLConnection.sendAsynchronousRequest(urlRequest,queue:NSOperationQueue.mainQueue(),completionHandler:{
(response: NSURLResponse!,data:NSData!,error:NSError!)-> Void in
if error == nil && data?.length > 0{
var image:UIImage = UIImage(data:data!)!
self.imageview.image = image
}
})
}
override func didReceiveMemoryWarning(){
super.didReceiveMemoryWarning()
}
}
下载的图片原图
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvSGVsbG9fSHdj/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" width="300" height="450" alt="">
Swift正在使用NSURLConnection异步下载同步(实例解析)的更多相关文章
- JavaWeb实现文件上传下载功能实例解析
转:http://www.cnblogs.com/xdp-gacl/p/4200090.html JavaWeb实现文件上传下载功能实例解析 在Web应用系统开发中,文件上传和下载功能是非常常用的功能 ...
- JavaWeb实现文件上传下载功能实例解析 (好用)
转: JavaWeb实现文件上传下载功能实例解析 转:http://www.cnblogs.com/xdp-gacl/p/4200090.html JavaWeb实现文件上传下载功能实例解析 在Web ...
- ios 网络数据下载和JSON解析
ios 网络数据下载和JSON解析 简介 在本文中笔者将要给大家介绍ios中如何利用NSURLConnection从网络上下载数据,如何解析下载下来的JSON数据格式,以及如何显示数据和图片的异步下载 ...
- iOS之网络数据下载和JSON解析
iOS之网络数据下载和JSON解析 简介 在本文中笔者将要给大家介绍IOS中如何利用NSURLconnection从网络上下载数据以及如何解析下载下来的JSON数据格式,以及如何显示数据和托图片的异步 ...
- Android 中的异步下载
网上提到最多的就是利用AsyncTask进行异步下载,用android-async-http第三方库的也比较多.这里写点注意事项. 先说说android-async-http,这个库发送请求利用thr ...
- 原生网络请求以及AFN网络请求/异步下载
这里对网络请求方式做一个总结. 原生方式同步GET请求: NSString *urlStr = @"http://apis.juhe.cn/mobile/get?phone=13429667 ...
- 「微信小程序」PHP异步进程async-helper实例详解
PHP异步进程async-helper实例详解 PHP 的异步进程助手,借助于 AMQP 实现异步执行 PHP 的方法,将一些很耗时.追求高可用.需要重试机制的操作放到异步进程中去执行,将你的 HTT ...
- 深入理解MVC C#+HtmlAgilityPack+Dapper走一波爬虫 StackExchange.Redis 二次封装 C# WPF 用MediaElement控件实现视频循环播放 net 异步与同步
深入理解MVC MVC无人不知,可很多程序员对MVC的概念的理解似乎有误,换言之他们一直在错用MVC,尽管即使如此软件也能被写出来,然而软件内部代码的组织方式却是不科学的,这会影响到软件的可维护性 ...
- iOS-同步下载与异步下载
一.同步下载(交互不好,容易出现卡死现象,一般下载数据较小或有特定需求才使用). 发送同步请求后,程序将停止用户交互,直到服务器返回数据完成后,才进行下一步的操作. //第一步:创建URL NSURL ...
随机推荐
- Oauth认证的时候报错:timestamp_refused
今天server大规模报错,大部分用户无法登陆,小部分能够登陆,非常是奇怪. 查看log.调试代码,发现问题是在oauth认证的时候出了问题,报 timestamp_refused. google了下 ...
- jQuery实现可编辑表格
在很多的网页中,这个可编辑表格在许多地方都是非常有用,配合上AJAX技术能够实现很好的用户体验,下面我 们就jQuery来说明一下可编辑表格的实现步骤 首先是HTML代码,非常简单 <!DOCT ...
- 同一个页面里的JS怎样获取jsp从别的页面获取的参数
<html><from name="from1"><input=hidden name="myhidden" value=< ...
- Advanced Data Structures
Advanced Data Structures Advanced Data Structures
- c++windows内核编程笔记day12 硬盘逻辑分区管理、文件管理、内存管理
windows系统磁盘文件存储: 分区格式:NTFS / FAT32 GetSystemDirectory();//获取系统路径 GetWindowsDirectory();//获取windows路径 ...
- expression:stream!=NULL
如果fopen()后返回的是NULL:就不能调用fclose()了: 用fopen()获得的文件句柄不是NULL,那么就需要用fclose()来关闭它.如果是NULL则不需要 null就表示你打开文件 ...
- hdu3294(manacher)
传送门:Girls' research 题意:求最长回文串并输出位置及转换后的字符串. 分析:manacher算法算出最长回文串后记录中心位置,然后再转换回原字符串的起始和结束位置. #pragma ...
- hdu4280(最大流)
传送门:Island Transport 题意:有N个岛屿 M条无向路 每个路有一最大允许的客流量,求从最西的那个岛屿最多能运用多少乘客到最东的那个岛屿. 分析:无向图正反都加弧,权值一样,这题点多, ...
- Selenium执行测试脚本稳定性的一些经验分享交流
Selenium执行测试脚本稳定性的一些经验分享交流 公司的自动化WEB测试框架IATA已上线运行了一段时间,期间发现一些脚本稳定性的问题,与大家分享一下. CASE执行游览器:ie firefox ...
- hdu1025(nlon(n)最长上升子序列)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1025 大致思路:设置两个a,b数组,a数组存储数据,b数组存储最长不降序序列.此算法关键在于设计二分查 ...