【问题标题】:Swift Custom Response Serializer is returning images at randomSwift Custom Response Serializer 随机返回图像
【发布时间】:2014-12-19 23:35:35
【问题描述】:

我目前正在使用 Alamofire 从服务器获取 Json 数据/url-images。我还使用此tutorial 创建了一个自定义响应序列化程序,以根据请求将 url 图像转换为 UIImages。

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

我遇到的问题是我的自定义响应以不同的顺序返回图像。

因此,显示的每张图片都没有按照最初开始时的正确顺序。有人知道我该如何解决这个问题吗...?

我能够使它工作的唯一方法是循环 0...4。但我需要遍历整个 NSMutableArray。

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)

        ###fetch json images and convert nsdata to image
        ###for some odd reason the order doesn't change if i do. (i < 4)
        for var i = 0; i < self.mutable_pages.count; i++ {
            let urlString: NSString = self.mutable_pages[i] as NSString
            var imgURL: NSURL = NSURL(string: urlString)!

            ###So far the images are in the order that I want
            Alamofire.request(.GET, imgURL).responseImage() {
                (request, _, image, error) in

                if error == nil && image != nil {
                    dispatch_async(dispatch_get_main_queue(), {

                        ###Somehow the images get appended at a random order, why?
                        self.pageImages.append(image!)
                    })
                }
            }

        }
    }
}

自定义回复

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

###This returns the images in a different order...
  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)
    })
  }
}

【问题讨论】:

    标签: swift uiimage afnetworking afnetworking-2 alamofire


    【解决方案1】:

    不知何故,图像以随机顺序附加,为什么?

    因为异步请求或异步分派的块无法保证顺序。

    您应该根据对应的页面(例如pages[i] = image)将图像键入到字典中(顺便说一句,使用for i in 0..&lt;pages.count { ... } 更容易且更传统)。

    或者更好的是,仅使用 AFNetworking 的 UIImageView 类别请求图像。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-04-29
      • 1970-01-01
      • 2016-06-02
      • 1970-01-01
      • 2012-01-21
      • 2013-09-28
      • 1970-01-01
      相关资源
      最近更新 更多