Ios Swift延迟加载属性Alamofire请求
我试图用Alamofire请求延迟加载属性(UIImage)。这就是我所处的位置:Ios Swift延迟加载属性Alamofire请求,ios,swift,asynchronous,lazy-loading,alamofire,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,
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”如果您正在处理图像,我建议您使用类似的方法,它可以与CocoaPods一起安装,用于加载图像,只需使用
DLImageLoader.sharedInstance().displayImageFromUrl("\(thumbnailUrl)", imageView: myImageView)
通过这种方式,在下载完成后加载图像,同时检查其他选项,有些选项带有回调,但上面的示例是最简单的
如果你在应用程序中多次需要图像,它甚至会使用缓存,我有一个实现,效果很好,我还有Alamofire。当我更换了AFNetworking后,我得到了这个补充,AFNetworking曾经有过这种图像下载管理嘿,伙计,用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
})
下载图像可能为零,如果出现问题。。。否则,您可以将其放入视图、数组或任何您想要的内容中
顺便说一下。。。lazy修饰符并不意味着图像加载为“lazy/async”。。。在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
}
您不必使用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!)
}
}
编辑:使用下面的代码,我能够成功地将图像加载到游乐场文件中。以前的问题是请求是异步的,这由于某种原因导致它不能正确返回
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
我认为延迟加载的属性中不允许函数调用
loadImage(:)
没有返回值(即Void
,也称()
);您试图将类型为UIImage
的惰性属性分配给不返回图像的函数的返回值。对于请求图像之类的异步任务,惰性或计算属性将不是合适的解决方案。使用方法调用很容易,我只是在尝试惰性加载,为什么你想让它变得惰性?它不一定会出现,或者在什么条件下你会显示它?嗨,凯尔,请检查我的答案,我相信它会帮助你:-)