我目前正在使用Alamofire从服务器获取Json数据/url图像。我还使用本教程创建了一个自定义响应序列化程序,以根据请求将 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)
})
}
}
不知何故,图像以随机顺序附加,为什么?
因为异步请求或异步调度的块不能保证顺序。
与其将图像附加到数组中,不如根据其相应的页面将它们键入字典中(例如 pages[i] = image
((顺便说一下,使用 for i in 0..<pages.count { ... }
更容易、更传统(。
或者更好的是,仅使用AFNetworking的UIImageView
类别按需请求图像。