当前位置: > > > Swift - 异步加载图片

Swift - 异步加载图片

(本文代码已升级至Swift4)

下面以加载hangge.com的logo图为例,演示如何使用异步请求加载图片数据。

1,使用NSURLConnection(不推荐)

由于NSURLConnection自iOS9起就被废弃,所以不再建议使用这个方法。而是使用后面的URLSession来替代。
//定义URL
let imgURL = URL(string:"http://hangge.com/blog/images/logo.png")!
//定义URLRequest
let request = URLRequest(url:imgURL)
//异步获取图片
NSURLConnection.sendAsynchronousRequest(request, queue: OperationQueue.main,
                                        completionHandler: { (response, data, error) in
    //将图片数据赋予UIImage
    let img = UIImage(data:data!)
    self.BgImageView.image = img
})


2,使用URLSession(推荐)

//创建URL对象
let url = URL(string:"http://hangge.com/blog/images/logo.png")!
//创建请求对象
let request = URLRequest(url: url)

let session = URLSession.shared
let dataTask = session.dataTask(with: request, completionHandler: {
    (data, response, error) -> Void in
    if error != nil{
        print(error.debugDescription)
    }else{
        //将图片数据赋予UIImage
        let img = UIImage(data:data!)
        self.BgImageView.image = img
    }
}) as URLSessionTask

//使用resume方法启动任务
dataTask.resume()
评论4
  • 4楼
    2017-12-12 09:21
    hiahiahia

    航哥,第二个方法第14行self.BgImageView.image = img这个BgImageView是什么意思啊?

    站长回复

    这只是做个例子,BgImageView是界面上的一个UIImageView,异步加载的图片显示在它上面。

  • 3楼
    2017-12-08 19:53
    笑笑

    用不了啊,运行进if error != nil{
    print(error.debugDescription)运行这个了

    }else{
    //将图片数据赋予UIImage
    let img = UIImage(data:data!)
    self.BgImageView.image = img
    }

    站长回复

    我测试了下是可以的啊。你报什么错误?检查下图片的地址是不是https开头的,如果是http开头的(比如文章样例里的那个图片地址),还需要在Info.plist里进行相关配置。具体参考:Swift - 网络请求报App Transport Security has blocked a cleartext错

  • 2楼
    2017-02-21 18:54
    ~

    站长辛苦 真的很不错 您的博客

    站长回复

    谢谢你的夸奖,我会坚持更新下去,创作更多更好的文章分享给大家。

  • 1楼
    2015-08-28 20:23
    swifter

    如果页面上有多 ImageView ,我怎么能在回调中知道要修改哪个 ImageView ?

    站长回复

    可以把加载图片封装成一个方法,参数是ImageView和url。
    在这个方法内进行ImageView的图片加载操作。
    fun loadImage(imgView:ImageView , imgURL:NSURL) {
      let request:NSURLRequest=NSURLRequest(URL:imgURL)
      ......
      NSURLConnection.sendAsynchronousRequest......
        imgView.image = img
      ......
    }