Carga rápida de la carga perezosa request Alamofire

Estoy intentando cargar una propiedad (UIImage) con una request de Alamofire. Aquí es donde estoy en:

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!) } } 

Error en: '()' no es convertible a 'UIImage'

Oye, el hombre es fácil de resolver con GCD …

Simplemente construye una class como esta:

 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) }) } }) } } 

Y que cargar sus imágenes como esta …

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

downloadedImage podría ser nulo, si algo salió mal … de lo contrario, podría ponerlo en su vista, o en una matriz, o lo que quiera …

Por cierto … El modificador perezoso no significa que la image esté cargada "perezosa / asíncrona" … En Swift puedes declarar / inicializar algo como perezoso, lo que significa que se declarará en init de su class, pero primero se inicializará poco antes de intentar acceder en primer lugar en el código … Eso podría ser en cualquier momento, o incluso nunca 🙂

O cambie su Código de este …

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

A esto…

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

Si estás trabajando con imágenes, te recomiendo que uses algo como DLImageLoader , se puede instalar con CocoaPods, para cargar una image solo usa

 DLImageLoader.shanetworkingInstance().displayImageFromUrl("\(thumbnailUrl)", imageView: myImageView) 

De esta forma, su image se carga cuando la descarga ha finalizado, también verifica las otras opciones, hay algunas con callback, pero el ejemplo anterior es el más simple

E incluso usa caching si necesita la image varias veces en su aplicación, tengo una implementación y funciona bien, y también tengo Alamofire. Llegué a este complemento una vez que reemplacé AFNetworking que solía tener este tipo de gestión de descarga de imágenes

No tiene que usar Alamofire para cargar una image. Sin embargo, puedes hacerlo asynchronous.

Podrías hacer algo como esto, cierre incluido:

 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!) } } 

EDIT: Pude cargar una image con éxito en un file Playground usando este código a continuación. El problema antes era que la request era asincrónica y que, por alguna razón, no le devolvía la propiedad correctamente.

 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 

Estoy pensando que las llamadas de function no están permitidas en las properties cargadas perezosas