Swift自定义响应序列化器随机返回图像 [英] Swift Custom Response Serializer is returning images at random

查看:82
本文介绍了Swift自定义响应序列化器随机返回图像的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我当前正在使用Alamofire从服务器获取Json数据/ URL图像。我还使用此教程创建了一个自定义响应序列化器,以将URL图像转换为UIImages



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



我遇到的问题是我的自定义响应会以不同的顺序。



因此,所显示的每个图像的显示顺序都不符合最初的显示顺序。有人知道我该如何解决...? >



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

  var pages = NSArray()

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

覆盖func viewDidLoad(){
super.viewDidLoad()

自已。 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)

###获取json图像并将nsdata转换为图像
###出于某些奇怪的原因如果我做的话,顺序不会改变。 (i <4)对于var i = 0,
;我< self.mutable_pages.count; i ++ {
让urlString:NSString = self.mutable_pages [i]作为NSString
var imgURL:NSURL = NSURL(string:urlString)!

###到目前为止,图像按我想要的顺序排列
Alamofire.request(.GET,imgURL).responseImage(){
(request,_,image ,错误)在

中,如果error == nil& image!= nil {
dispatch_async(dispatch_get_main_queue(),{

###以某种方式随机附加图像,为什么?
self.pageImages.append(image !)
})
}
}

}
}
}

自定义响应

 扩展名Alamofire.Request {
类func imageResponseSerializer()->序列化器{
return {请求,响应,
中的数据,如果data == nil {
return(nil,nil)
}

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

return(image,nil)
}
}

# ##这将以不同的顺序返回图像...
func responseImage(completionHandler:(NSURLRequest,NSHTTPURLResponse ?, UIImage ?, NSError?)->无效)->自我{
返回响应(序列化器:Request.imageResponseSerializer(),complementHandler:
中的{(请求,响应,图像,错误)$ completionHandler(请求,响应,图像为UIImage,错误)
})
}
}


解决方案

< blockquote>

为什么以随机顺序附加图像,为什么?


因为不能保证顺序异步请求或异步分发的块。



与其将图像附加到数组中,不如根据它们对应的页面将它们键入字典(例如 pages [i] = image )(顺便说一句,对于i in 0,使用更容易和更常规。.)。



甚至更好,仅使用AFNetworking的 UIImageView 类别按需请求图像。


I am currently using Alamofire to Fetch Json data/url-images from a Server. I also created a custom response serializer using this tutorial to convert url images into UIImages upon request.

Everything works fine, and I am able to load all of the Images from the server into a UIImageView. The user can then swipe from left to right in order to View each image like a Photo Gallery.

The Problem I am having is that my custom response returns the images in a different order.

Therefore, every image being displayed is not in the correct order it initially started in. Would anyone know how I can fix this...?

The only way I've been able to make it work is if I loop through 0...4. But i need to loop through the entire 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!)
                    })
                }
            }

        }
    }
}

CUSTOM RESPONSE

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

解决方案

Somehow the images get appended at a random order, why?

Because order is not guaranteed for asynchronous requests or blocks dispatched asynchronously.

Instead of appending images into an array, you should key them into a dictionary according to their corresponding page (e.g. pages[i] = image) (by the way, it's easier and more conventional to use for i in 0..<pages.count { ... }).

Or even better, only request the images on demand using AFNetworking's UIImageView category.

这篇关于Swift自定义响应序列化器随机返回图像的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆