Swift懒惰负载属性Alamofire请求

时间:2015-08-09 16:12:19

标签: ios swift asynchronous lazy-loading alamofire

我正在尝试使用Alamofire请求延迟加载属性(UIImage)。这就是我所在的地方:

public lazy var theImage: UIImage = MyCalass.loadImage { (imageTest) -> Void in
    return imageTest
}

class public func loadImage(completion: (imageTest: UIImage) -> Void){
    Alamofire.request(.GET, "http://pathtoimage/image.jpg").response { (request, response, data, error) in
        var tempImage = UIImage(data: data!, scale:1)
        completion(imageTest: tempImage!)
    }
}

错误:'()'无法转换为'UIImage'

3 个答案:

答案 0 :(得分:2)

嘿,GCD很容易解决......

只需建立一个这样的类:

class AsynchImageLoader {
    class func loadImageAsync (imageURL: NSURL, completionHandler: (downloadedImage: UIImage?) -> Void) {
        dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), { () -> Void in
            if let imageData: NSData = NSData(contentsOfURL: imageURL) {
                if let imageImage: UIImage = UIImage(data: imageData) {
                    dispatch_async(dispatch_get_main_queue(), { () -> Void in
                        completionHandler(downloadedImage: imageImage)
                    })
                } else {
                    dispatch_async(dispatch_get_main_queue(), { () -> Void in
                        completionHandler(downloadedImage: nil)
                    })
                }
            } else {
                dispatch_async(dispatch_get_main_queue(), { () -> Void in
                    completionHandler(downloadedImage: nil)
                })
            }
        })
    }
}

而不是像这样加载你的图像...

let imageView: UIImageView = UIImageView()
        AsynchImageLoader.loadImageAsync(NSURL(string: "yourURL")!, completionHandler: { (downloadedImage) -> Void in
            imageView.image = downloadedImage
        })
如果出现问题,

downloadedImage可能是nil ...否则你可以把它放到你的视图,数组或任何你想要的内容中......

顺便说一句......延迟修饰符并不意味着图像被加载“lazy / async”...在Swift中你可以声明/初始化一些东西,因为它意味着它将在init上声明它class,但它会在您第一次尝试在代码中访问它之前不久进行初始化...这可能是任何时间,甚至永远不会: - )

或者更改您的代码...

public lazy var theImage: UIImage = MyCalass.loadImage { (imageTest) -> Void in
    return imageTest
}

对此...

var theImage: UIImage? 
MyCalass.loadImage { (imageTest) -> Void in
    theImage = imageTest
}

答案 1 :(得分:0)

如果您正在处理图片,我建议您使用类似DLImageLoader的内容,可以使用CocoaPods安装,只需使用

加载图片
DLImageLoader.sharedInstance().displayImageFromUrl("\(thumbnailUrl)", imageView: myImageView)

这样下载完成后你的图像就被加载了,还检查了其他选项,还有一些有回调,但上面的例子是最简单的

如果您在应用程序中需要多次图像,它甚至会使用缓存,我有一个实现它并且工作得很好,我也有Alamofire。一旦我取代曾经有过这种图像下载管理的AFNetworking,我就来到了这个补充

答案 2 :(得分:0)

您不必使用Alamofire加载图像。你可以让它异步。

你可以这样做,包括闭包:

lazy var theImage: UIImage = {
    var sampImage = getImage({ (image) in
        return image
    })
}()

func getImage(completion: UIImage -> ()) {
    var newImage: UIImage?

    let priority = DISPATCH_QUEUE_PRIORITY_DEFAULT
    dispatch_async(dispatch_get_global_queue(priority, 0)) {
        let url = NSURL(string: "http://pathtoimage/image.jpg")
        let data = NSData(contentsOfURL: url!)
        newImage =  UIImage(data: data!)!

        completion(newImage!)
    }
}

编辑:我能够使用下面的代码在Playground文件中成功加载图像。之前的问题是请求是异步的,由于某种原因导致它无法正常返回。

import UIKit

class Example {

    lazy var theImage: UIImage = {

        var newImage: UIImage?

        let url = NSURL(string: "http://2.bp.blogspot.com/-XJbC3jA7cOo/VW2ItW5aRjI/AAAAAAAACcc/_f_WhTEXvFQ/s1600/testPattern.png")
        let data = NSData(contentsOfURL: url!)
        newImage =  UIImage(data: data!)!

        println(data)

        return newImage!
    }()

    init() {}
}

var exp = Example()

exp.theImage

我认为在延迟加载的属性中不允许函数调用