Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用Alamofire在swift中加载图像_Swift_Afnetworking_Alamofire - Fatal编程技术网

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

如何使用Alamofire在swift中加载图像,swift,afnetworking,alamofire,Swift,Afnetworking,Alamofire,我有一个集合视图控制器,它通过URL异步加载图像。 (类似于Instegram) 我正在寻找实现加载映像部分的最佳方法。 请告诉我你觉得怎么样 第一种方式-没有任何外部库: let downloadQueue = dispatch_queue_create("com.pro.asyncImages",nil) dispatch_async(downloadQueue){ var data = NSData(contentsOfURL: NSURL(string:

我有一个集合视图控制器,它通过URL异步加载图像。 (类似于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
        }
    }
第二种方法-使用Alamofire(请求属于Alamofire)

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

那么,AFN网络是否更适合此任务?(然后是阿拉莫菲尔) 如果没有,我不知道如何将AFNetworking添加到我的swift项目中,除了添加#import“AFNetworking.h”之外,我还需要添加哪些文件

请解释哪种方法是最好的,我需要的是性能、指控、缓存。 视图采集控制器的作用类似于Instegram,在向下滚动时加载图像。 我希望我对我需要的东西足够清楚,
谢谢你

如果你想使用AFNetworking的UImageView框架,你必须在你的网桥头文件中导入“UIImageView+AFNetworking.h”

AFNetworking有一个共享缓存,所以您不需要手动缓存或取消请求。AFNetworking中的
setImageWithURL
可以轻松地将URL转换为ImageView中的图像

使用
UIImage+AFNetworking
的示例代码:

cell.imageView.setImageWithURL(NSURL(string:imageSource), placeholderImage: UIImage(named:"placeholder"))
如果您使用的是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.
        */
      }
    }
  } 

您可以阅读有关使用Alamofire的更多详细信息。

我在此处创建了UIImageView+AFNetworking的Swift版本:
您不必在项目中使用AFNetworking(和桥接头)或Alamofire。只需将文件添加到项目中并使用它


用法示例:

myImageView.setImageWithUrl(imageUrl, placeHolderImage: somePlaceHolderImage)

正如作者在Alamofire中提到的:

我应该什么时候使用AFN网络?
  • UIKit扩展,例如将图像异步加载到UIImageView
因此,请回答您的问题:

那么,AFN网络是否更适合此任务

对!

但如果仍要使用vanilla
Alamofire
project,则可以通过以下方式获取图像:

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

附言

但如果您只想加载映像(当然是异步的),则根本不需要使用
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)
            }
        }
    }
}
并使用它:

myImageView.imageFromUrl("https://robohash.org/123.png")

我开发了一个小而简单的CocoaPods库来处理Alamofire和图像

CocoaPods是解决库依赖性需求的一种很好的方法。它很容易安装一次,也很容易向项目添加和更新依赖项

该库是开源的,可以在

它有很好的文档和示例,所以您很快就会喜欢它


我自己也在几个项目中使用它,包括集合视图和滚动。

摘自Alamofire/README.md

为了保持ALAMOFE专注于核心网络实现,ALAMOFRAE软件基金会创建了额外的组件库,为ALAMOFRAE生态系统带来额外的功能。 AlamofireImage—一个图像库,包括图像响应序列化程序、UIImage和UIImageView扩展、自定义图像过滤器、自动清除内存缓存和基于优先级的图像下载系统。”


实际上,有多种方法可以使用Alamofire从URL加载图像。 这是我开发的一种方法,我已经在我的一个Swift项目中使用了它。通过这种方式,我异步加载图像并将其显示到UITableView中,从性能角度看,这很好,滚动UITableView时没有阻塞,因为它关心如何兑现加载的图像

首先,您必须使用Alamofire创建GET请求以下载图像,并且必须使用AlamofireImage库中的request+AlamofireImage,因此您必须

import AlamofireImage
然后在

    override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
}

您必须按如下方式调用图像下载请求:

         //Download image
        // We should perform this in a background thread
        Alamofire.request(.GET, deshItem.dish_imageUrl!)
            .responseImage { response in
                debugPrint(response)

                print(response.request)
                print(response.response)
                debugPrint(response.result)

                if let image = response.result.value {
                    print("image downloaded: \(image)")

                    // Store the commit date in to our cache
                    self.ImageCache[dishName!] = image

                    // Update the cell
                    dispatch_async(dispatch_get_main_queue(), {
                        if let cellToUpdate = tableView.cellForRowAtIndexPath(indexPath) {
                                let dishImageView:UIImageView = cellToUpdate.viewWithTag(104) as! UIImageView
                                dishImageView.image = image

                        }
                    })

                }
        }
对于图像缓存,我创建了一个字典,其中包含每个单元格或项目(字符串)的图像,因此这种缓存图像的方式将避免滚动时出现的锁定

完整的示例代码:

import AlamofireImage

class MainFeedTableViewController: UITableViewController, FloatRatingViewDelegate {

var ImageCache = [String:UIImage]()


override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCellWithIdentifier("MainFeedCellID", forIndexPath: indexPath)

    // Configure the cell...

    let dishName = deshItem.dish_name

    //This is a workaround to cash the image and improve the performance while user scrolling UITableView.
    // If this image is already cached, don't re-download
    if let dishImage = ImageCache[dishName!] {
                let dishImageView:UIImageView = cell.viewWithTag(104) as! UIImageView
                dishImageView.image = dishImage
    }
    else {
        //Download image
        // We should perform this in a background thread
        Alamofire.request(.GET, deshItem.dish_imageUrl!)
            .responseImage { response in
                debugPrint(response)

                print(response.request)
                print(response.response)
                debugPrint(response.result)

                if let image = response.result.value {
                    print("image downloaded: \(image)")

                    // Store the commit date in to our cache
                    self.ImageCache[dishName!] = image

                    // Update the cell
                    dispatch_async(dispatch_get_main_queue(), {
                        if let cellToUpdate = tableView.cellForRowAtIndexPath(indexPath) {
                                let dishImageView:UIImageView = cellToUpdate.viewWithTag(104) as! UIImageView
                                dishImageView.image = image

                        }
                    })

                }
        }

    }



    return cell
}

以下是使用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) }
    }
}

您可以使用
responseData(队列:completionHandler:)

SWIFT 4

func downloadImages(imageURL: String) {

    Alamofire.request(imageURL, method: .get)
        .validate()
        .responseData(completionHandler: { (responseData) in
            self.yourImageVIew.image = UIImage(data: responseData.data!) 
            DispatchQueue.main.async {
                // Refresh you views
            }
        })
}

在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)
    }
}

AFNetworking的编码器与Alamofire相同,我认为是相同的实现,但在SwiftThat中,这非常有用,我发现添加AFNetworking比向我的项目中添加代码更简单、更快速,非常感谢!与使用NSURLCache控制图像缓存相比,这有什么优势吗?有一个单独的库AlamofireImage用于处理图像。它还负责缓存和更多选项-在找到您的文件之前,我需要为这个文件集成整个框架。。。。。大的Thanks@MrugeshTank:哈哈,是的,这就是写这篇文章的全部目的:如果我使用Github链接中提到的文件,如何设置/重置缓存?此缓存是否有最大大小?1)不适用于Swift 2)它与Alamofire无关3)这不是问题的答案。我是一名新手,正在学习过时的教程(),我需要将其转换为最新的Swift 2.0+Alamofire 3设置。为此,我认为我还需要安装AlomFireImage,但我该如何做到这一点?与我安装alamofire的方法相同,AlamofireImage为我解决了缓存通过http
sendAsynchronousRequest获取的图像的问题<
  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)
    }
}