在后台 Swift 中循环并将 json 数据附加到 UIImage[] 中

Posted

技术标签:

【中文标题】在后台 Swift 中循环并将 json 数据附加到 UIImage[] 中【英文标题】:loop and append json data into UIImage[] in Background Swift 【发布时间】:2014-12-17 03:40:12 【问题描述】:

我目前正在使用 Alamofire 从服务器获取 Json 数据/url-images。

一切正常,我可以将服务器中的所有 url-images 加载到 UIImageView 中。然后,用户可以从左向右滑动,以便像查看照片库一样查看每个图像。

目前,当我获取数据时,我会遍历我的 NSArray,将每个 url 转换为图像,然后将每个图像附加到 UIImage[]。

循环通过 NSArray 确实会在我的应用程序第一次启动时减慢它的速度,有没有办法加快这个过程?还是一种更好/更快的方式将网址转换为后台图像?

var pages = NSArray()

var mutable_pages = NSMutableArray()
var pageImages: [UIImage] = []

override func viewDidLoad() 
    super.viewDidLoad()

    self.fetchPages()



func fetchPages() 
    Alamofire.request(.GET, "http://www.myurl.com/api/pages.json").responseJSON() 
        (_, _, data, _) in

        self.pages = data!.valueForKey("page_url") as NSArray!

        self.mutable_pages = NSMutableArray(array: self.pages)

        ###THIS IS REALLY SLOW, IS THERE A FASTER SOLUTION
        for var i = 0; i < self.mutable_pages.count; i++ 

            ###Construct the imgUrl to get an image URL for the pages
            let urlString: NSString = self.mutable_pages[i] as NSString
            var imgURL: NSURL = NSURL(string: urlString)!
            var imgData: NSData = NSData(contentsOfURL: imgURL)!

            ###append each image into UIImage
            self.pageImages.append(UIImage(data: imgData)!)

        

    

【问题讨论】:

如果分析你的项目,我想你会发现var imgData: NSData = NSData(contentsOfURL: imgURL)! 是真正花费最多时间的地方。我也不认为有任何解决办法。获取图像是一项繁重的任务。 确保您的图像获取/解码是在主线程之外完成的。您还必须设计您的应用程序以处理由于仍在下载图像而导致图像不可用的任何时间 你也可以延迟获取你的图片。例如,获取前 3 张图像(图像 0、图像 1 和图像 n),然后每次用户滑动时,获取下一张图像(如果他们向右滑动,则为图像 2,如果向左滑动,则为图像 n-1) @Paulw11 我喜欢你的想法,你有代码示例吗?我对 ios 很陌生。 使用像 SDWebImage 这样的东西可能是最简单的github.com/rs/SDWebImage 【参考方案1】:

所以我想出了一个解决方案。我基本上使用这个tutorial 创建了一个自定义响应序列化程序。

这样,您可以编写一个自定义响应序列化程序,为您直接将其转换为 UIImage,而不是接收您必须转换为 UIImage 的 NSData。

自定义回复

extension Alamofire.Request 
  class func imageResponseSerializer() -> Serializer 
    return  request, response, data in
      if data == nil 
        return (nil, nil)
      

      let image = UIImage(data: data!, scale: UIScreen.mainScreen().scale)

      return (image, nil)
  


  func responseImage(completionHandler: (NSURLRequest, NSHTTPURLResponse?, UIImage?, NSError?) -> Void) -> Self 
    return response(serializer: Request.imageResponseSerializer(), completionHandler:  (request, response, image, error) in
      completionHandler(request, response, image as? UIImage, error)
    )
  

然后我使用了 cellForIndexAtIndexPath

内的 Alamofire 请求中的 responseImage
var request: Alamofire.Request?

cell.request = Alamofire.request(.GET, imageURL).responseImage() 
  (request, _, image, error) in
  if error == nil && image != nil 
    if request.URLString == cell.request?.request.URLString 
      cell.imageView.image = image
    
  

【讨论】:

以上是关于在后台 Swift 中循环并将 json 数据附加到 UIImage[] 中的主要内容,如果未能解决你的问题,请参考以下文章

如何循环 RestClient 请求传递 id 然后附加到响应

附加 JSON 数据 Swift

循环一个 json 文件并填充一个数组 Swift

Swift JSON响应两个字段值附加到单个数组中

循环 LINQ 查询并将结果附加到 DataTable

从 json 中提取日期和数字并将它们附加到 pandas 数据框