Swift惰性加载属性Alamofire请求

3

我想要用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'


2
loadImage(_:) 没有返回值(即 Void,也称为 ()); 您正在尝试将类型为 UIImage 的懒加载属性分配给不返回图像的函数的返回值。 - mattt
对于像请求图像这样的异步任务,懒加载或计算属性并不是合适的解决方案。 - mattt
这很容易通过方法调用来实现,我只是在尝试懒加载。 - Kyle Goslan
为什么要将它变成懒加载?它不一定会出现或者你将在什么条件下展示它? - dGambit
你不能从闭包中创建或返回数据到一个懒加载属性。 - NFerocious
显示剩余2条评论
3个回答

2

嘿,用最大公约数很容易解决...

只需构建一个类似于以下的类:

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可能为空...否则,您可以将其放入视图、数组或其他任何您想要的地方...

顺便说一句...懒加载修饰符并不意味着图像是“懒/异步”加载的...在Swift中,您可以声明/初始化某些内容为lazy,这意味着它将在其类的init上声明,但它将在您首次尝试在代码中访问它之前短暂地进行初始化...这可能是任何时间,甚至从不:-)

或者将您的代码从此更改...

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

将此...

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

0
如果你正在处理图像,我建议你使用类似DLImageLoader的东西,它可以通过CocoaPods安装。要加载图像,只需使用
DLImageLoader.sharedInstance().displayImageFromUrl("\(thumbnailUrl)", imageView: myImageView)

这样,当下载完成时,您的图像将被加载,还要检查其他选项,其中一些带有回调函数,但上面的示例是最简单的。
如果您的应用程序需要多次使用该图像,它甚至可以使用缓存。我有一个实现,并且效果很好,我还有Alamofire。我曾经用AFNetworking替换过它,后者曾经具有这种类型的图像下载管理功能。

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

我认为惰性加载属性中不允许函数调用。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接