Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/103.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios Swift延迟加载属性Alamofire请求_Ios_Swift_Asynchronous_Lazy Loading_Alamofire - Fatal编程技术网

Ios Swift延迟加载属性Alamofire请求

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,

我试图用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”

如果您正在处理图像,我建议您使用类似的方法,它可以与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
的惰性属性分配给不返回图像的函数的返回值。对于请求图像之类的异步任务,惰性或计算属性将不是合适的解决方案。使用方法调用很容易,我只是在尝试惰性加载,为什么你想让它变得惰性?它不一定会出现,或者在什么条件下你会显示它?嗨,凯尔,请检查我的答案,我相信它会帮助你:-)