如何使用Alamofire在swift中加载图像

use*_*728 28 afnetworking swift alamofire

我有一个集合视图控制器,它通过URL加载图像Async.(像Instegram这样的东西)我正在寻找实现加载图像部分的最佳方法.请告诉我你的想法

第一种方式 - 没有任何外部库:

   let downloadQueue = dispatch_queue_create("com.pro.asyncImages",nil)
    dispatch_async(downloadQueue){

        var data = NSData(contentsOfURL: NSURL(string: pictureUrl!)!)

        var image: UIImage?
        if (data != nil){
            image = UIImage(data: data!)
        }
        dispatch_async(dispatch_get_main_queue()){
            uiImageView.image = image
        }
    }
Run Code Online (Sandbox Code Playgroud)

第二种方式 - 使用Alamofire(请求属于Alamofire)

if let  mediaUrl = info.mediaUrl {
        request(.GET,mediaUrl).response(){
            (_, _, data, _) in
            let image = UIImage(data: data! as NSData)
            imageView.image = image
        }
    }
Run Code Online (Sandbox Code Playgroud)

最后,我读到AFNetworking在将url异步加载到urlImage方面做得很好,这就是我想要做的.

那么AFNetworking更适合这项任务吗?(然后是Alamofire)如果没有,我不明白如何将AFNetworking添加到我的swift项目中,除了添加#import"AFNetworking.h",我需要添加哪些文件?

请解释哪种方法最好,我的需求是性能,指责,缓存.视图集合控制器就像Instegram一样,正在加载图像,同时向下滚动.我希望我对自己需要的东西足够清楚,谢谢

sky*_*der 46

正如作者在Alamofire中提到的README.md:

我什么时候应该使用AFNetworking?

  • UIKit扩展,例如将图像异步加载到UIImageView

所以回答你的问题:

那么AFNetworking更适合这项任务吗?

是!

但是如果仍然想使用vanilla Alamofire项目,你可以这样获取图像:

   Alamofire.request(.GET, "https://robohash.org/123.png").response { (request, response, data, error) in
        self.myImageView.image = UIImage(data: data, scale:1)
    }
Run Code Online (Sandbox Code Playgroud)

PS

但是,如果您只想加载图像(当然是异步) - 您根本不需要使用Alamofire或根本不需要AFNetworking.只需在代码中添加此小扩展名:

extension UIImageView {
    public func imageFromUrl(urlString: String) {
        if let url = NSURL(string: urlString) {
            let request = NSURLRequest(URL: url)
            NSURLConnection.sendAsynchronousRequest(request, queue: NSOperationQueue.mainQueue()) {
                (response: NSURLResponse!, data: NSData!, error: NSError!) -> Void in
                self.image = UIImage(data: data)
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

并使用它:

myImageView.imageFromUrl("https://robohash.org/123.png")
Run Code Online (Sandbox Code Playgroud)

  • 在iOS 9中不推荐使用`sendAsynchronousRequest`.使用`NSURLSession.dataTaskWithURL`代替,虽然我总是选择Alamofire,尤其是RxAlamofire,请参阅下面的答案. (5认同)

nam*_*ams 17

我在这里创建了一个Swift版本的UIImageView + AFNetworking:Github.
您不必在项目中使用AFNetworking(和桥接标题)或Alamofire.只需将文件添加到项目中即可使用.


用法示例:

myImageView.setImageWithUrl(imageUrl, placeHolderImage: somePlaceHolderImage)
Run Code Online (Sandbox Code Playgroud)

  • @MrugeshTank:哈哈,是的,这就是写这个的全部要点:D (2认同)
  • 1)不适用于Swift 2 2)它不是关于Alamofire 3)它不是问题的答案. (2认同)

jam*_*.ff 14

取自Alamofire/README.md

"为了让Alamofire专注于核心网络实施,Alamofire软件基金会创建了额外的组件库,为Alamofire生态系统带来了额外的功能.

AlamofireImage - 包含图像响应序列化器,UIImage和UIImageView扩展,自定义图像过滤器,自动清除内存缓存和基于优先级的图像下载系统的图像库."

https://github.com/Alamofire/AlamofireImage


Ena*_*que 12

在 swift 5 和 Alamofire 5 中,您可以像下面这样使用..

  AF.request( "https://robohash.org/123.png",method: .get).response{ response in

   switch response.result {
    case .success(let responseData):
        self.myImageView.image = UIImage(data: responseData!, scale:1)

    case .failure(let error):
        print("error--->",error)
    }
}
Run Code Online (Sandbox Code Playgroud)


zta*_*tan 7

如果要使用AFNetworking的UImageView框架,则必须#import "UIImageView+AFNetworking.h"在桥头文件中执行.

AFNetworking具有共享缓存,因此您无需手动缓存或取消请求.该setImageWithURL从AFNetworking可以很容易地将URL转换为图像的ImageView的.

示例代码使用UIImage+AFNetworking:

cell.imageView.setImageWithURL(NSURL(string:imageSource), placeholderImage: UIImage(named:"placeholder"))
Run Code Online (Sandbox Code Playgroud)

如果您使用的是Alamofire,则必须手动将NSData转换为UIImage.对于Alamofire,您可以创建一个NSCache()对象来缓存图像.两个库的性能应该相似.您可以将Alamofire用于服务器API调用,然后使用AFNetworking异步显示图像.

使用Alamofire进行图像缓存的示例代码:

let imageCache = NSCache()

 if let image = self.imageCache.objectForKey(imageURL) as? UIImage {
    cell.imageView.image = image
  } else {
    // 3
    cell.imageView.image = nil

    // 4
    cell.request = Alamofire.request(.GET, imageURL).validate(contentType: ["image/*"]).responseImage() {
      (request, _, image, error) in
      if error == nil && image != nil {
        // 5
        self.imageCache.setObject(image!, forKey: request.URLString)

        // 6
        if request.URLString == cell.request?.request.URLString {
          cell.imageView.image = image
        }
      } else {
        /*
        If the cell went off-screen before the image was downloaded, we cancel it and
        an NSURLErrorDomain (-999: cancelled) is returned. This is a normal behavior.
        */
      }
    }
  } 
Run Code Online (Sandbox Code Playgroud)

您可以阅读本教程,了解有关使用Alamofire的更多详细信息.

  • 有一个单独的库AlamofireImage用于处理图像.它还负责缓存和更多选项 - https://github.com/Alamofire/AlamofireImage (2认同)

Luk*_*eau 6

这是使用RxAlamofire的方法:

import Alamofire
import RxAlamofire

extension UIImageView {
    public func imageFromUrl(urlString: String) {
        requestData(.GET, urlString)
            .observeOn(MainScheduler.instance)
            .subscribeNext { self.image = UIImage(data: $0.1) }
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 我试过你的方法,但后来我得到以下错误:使用未解析的标识符'MainScheduler'.任何线索如何摆脱它? (2认同)