我正在尝试使用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'
答案 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
我认为在延迟加载的属性中不允许函数调用