完成处理程序的返回值 - Swift

14

我在一个实用程序类中使用loadImage方法,但在通过闭包返回图像时遇到了一些问题。基本上,因为我的代码可以返回图像或错误,当调用该方法时将其分配给图像属性将无法正常工作。

我在类的方法声明中使用的方法是否有误,还是应该以不同的方式调用该方法以预期可能不同的结果?谢谢。

public class UtilitiesService: NSObject {
    public class func loadImage(urlString:String)
    {

    var imgURL: NSURL = NSURL(string: urlString)!
    let request: NSURLRequest = NSURLRequest(URL: imgURL)
    NSURLConnection.sendAsynchronousRequest(
        request, queue: NSOperationQueue.mainQueue(),
        completionHandler: {(response: NSURLResponse!,data: NSData!,error: NSError!) -> Void in
            if error == nil {
                self.returnImage(data)
            }
    })
}

public class func returnImage(imageData: NSData) -> UIImage {

    return UIImage(data: imageData)!

}
}

//// view controller
class someView: UIViewController {
var image.image = loadImage(url) ///will throw a return type error
 }
2个回答

27

向您的 loadImage 函数添加处理程序:

Swift 3

 func loadImage(_ urlString: String, handler:@escaping (_ image:UIImage?)-> Void)
    {

        let imageURL: URL = URL(string: urlString)!

        URLSession.shared.dataTask(with: imageURL) { (data, _, _) in
            if let data = data{
                handler(UIImage(data: data))
            }
        }.resume()
    }

这样调用函数:

loadImage("SomeURL") { (image) -> Void in
            if let image = image{
                DispatchQueue.main.async {
                    self.imageView.image = image
                }
            }
        }

Swift 2.3

(翻译:Swift 2.3)
func loadImage(urlString: String, handler: (image:UIImage?)-> Void)
    {

        let imageURL: NSURL = NSURL(string: urlString)!

        NSURLSession.sharedSession().dataTaskWithURL(imageURL) { (data, _, _) in
            if let data = data{
                handler(image: UIImage(data: data))
            }
            }.resume()
    }

像这样调用函数:

  loadImage("someURL") { (image) -> Void in
            if let image = image{
                dispatch_async(dispatch_get_main_queue()) {
                    self.imageView.image = image
                }
            }
        }

3
我会这样做:

我会这样做:

public class UtilitiesService: NSObject {
    public class func loadImage(urlString:String, completion:(resultImage:UIImage) -> Void)
    {

    var imgURL: NSURL = NSURL(string: urlString)!
    let request: NSURLRequest = NSURLRequest(URL: imgURL)
    NSURLConnection.sendAsynchronousRequest(
        request, queue: NSOperationQueue.mainQueue(),
        completionHandler: {(response: NSURLResponse!,data: NSData!,error: NSError!) -> Void in
            if error == nil {
                completion(resultImage: UIImage(data: data))
            }
    })
}
}

//// view controller
class someView: UIViewController {
var image: UIImageView()? //Create the variable the way you need
loadImage(url, completion: { (resultImage) -> Void in
    image = resultImage //Assign the result to the variable
})
 }

我认为这个方法可行,如果行不通,请告诉我,我会进行修正。


谢谢!但是出现了以下错误:无法将类型“()”的值分配给类型“UIImage?”的值。 - Phil Hudson
哦,我没看到,给我一秒钟。 - Dante Puglisi

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