【问题标题】:cannot convert the expressions type UIImage to type void swift无法将表达式类型 UIImage 转换为类型 void swift
【发布时间】:2015-02-02 05:11:38
【问题描述】:

我有一个问题,我正在尝试创建一个接受 PFObject 作为参数的方法。本例中的 PFObject 是 facebook 图片 URL。该方法采用 URL 并基本上将其转换为图像。如果我只使用这段代码而不试图将它变成一个方法,我可以让它工作,但是我想从中创建一个方法,这样我就不必不断重复自己。当我尝试返回用户图像时,我不断收到错误cannot convert the expressions type UIImage to type void swift

这里是代码

func downloadFBUserImage(object: PFObject?) -> UIImage? {
var userProfilePhotoURLString = object?.valueForKey("pictureURL") as String?
if userProfilePhotoURLString != nil {
    var pictureURL: NSURL = NSURL(string: userProfilePhotoURLString!)!
    var urlRequest: NSURLRequest = NSURLRequest(URL: pictureURL)
    NSURLConnection.sendAsynchronousRequest(urlRequest, queue: NSOperationQueue.mainQueue(), completionHandler: { (NSURLResponse response, NSData data, NSError error) -> Void in
        if error == nil && data != nil {
            var userProfilePic: UIImage? = UIImage(data: data)
            return userProfilePic
        }


    })
    return nil
}

【问题讨论】:

    标签: xcode swift parse-platform


    【解决方案1】:

    错误报告sendAsynchronousRequestcompletionHandler 被定义为传递responsedataerror 对象,但它预计completionHandler 本身不会返回任何值。但是您正试图从 completionHandler 闭包中返回一个值。

    底线,你不能简单地从你的函数中返回UIImage,因为你正在执行异步方法(即,即使你立即从函数中返回,数据也会稍后返回)。所以,采用异步模式:

    func downloadFBUserImage(object: PFObject?, completionHandler: (UIImage?, NSError?) -> Void) {
        if let userProfilePhotoURLString = object?.valueForKey("pictureURL") as? String {
            let pictureURL = NSURL(string: userProfilePhotoURLString)!
            let urlRequest = NSURLRequest(URL: pictureURL)
            NSURLConnection.sendAsynchronousRequest(urlRequest, queue: NSOperationQueue.mainQueue()) { (response, data, error) -> Void in
                if data != nil {
                    var userProfilePic = UIImage(data: data)
                    completionHandler(userProfilePic, nil)
                } else {
                    completionHandler(nil, error)
                }    
            }
        }
    }
    

    您可以使用与sendAsynchronousRequest 相同的完成处理程序模式来调用它:

    downloadFBUserImage(object) { image, error in 
        if image == nil {
            println(error)
        } else {
            // use the image here
        }
    }
    
    // but don't try to use asynchronously retrieved image here
    

    【讨论】:

    • 啊好吧!我一直认为,由于完成处理程序位于函数内,它也可以返回一个值。谢谢你帮我解决这个问题!
    【解决方案2】:

    你不能像那样返回完成块。完成块没有返回参数。这就是您收到错误的原因。

    要在下载后更新图像,您可以将一个块与您的 downloadFBUserImage 函数一起传递,如下所示。

    我使用了dispatch_async,因为 UI 更新必须在主线程上完成。

    func downloadFBUserImage(object: PFObject?, completion completionBlock:(UIImage) -> ()) -> (){
        var userProfilePhotoURLString = object?.valueForKey("pictureURL") as String?
        if userProfilePhotoURLString != nil {
            var pictureURL: NSURL = NSURL(string: userProfilePhotoURLString!)!
            var urlRequest: NSURLRequest = NSURLRequest(URL: pictureURL)
            NSURLConnection.sendAsynchronousRequest(urlRequest, queue: NSOperationQueue.mainQueue(), completionHandler: { (NSURLResponse response, NSData data, NSError error) -> Void in
                if error == nil && data != nil {
                    if let userProfilePic = UIImage(data: data) {
                       completionBlock(userProfilePic)
                    }
                }
            })
        }
    }
    

    可以这样调用

    func do() {
        downloadFBUserImage(pfObject, completion: { (image) -> () in
                //updateImage
              dispatch_async(dispatch_get_main_queue(), { () -> Void in
                  // UI updates
              }
        })
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-10-25
      • 2018-08-16
      • 1970-01-01
      • 2021-01-15
      相关资源
      最近更新 更多