无法将表达式类型 UIImage 转换为类型 void swift

cannot convert the expressions type UIImage to type void swift

我有一个问题,我正在尝试创建一个接受 PFObject 作为参数的方法。本例中的 PFObject 是 facebook 图片 URL。该方法采用 URL 并基本上将其转换为图像。如果我只是使用这个代码块而不试图将它变成一个方法,我可以让它工作,但是我想从中创建一个方法,这样我就不必一直重复自己。当我尝试 return 用户图像时,我不断收到错误 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
}

错误报告说 sendAsynchronousRequestcompletionHandler 被定义为传递给您 responsedataerror 对象,但是它期望 completionHandler 本身不 return 任何值。但是您正在尝试从 completionHandler 闭包中 return 一个值。

最重要的是,你不能简单地从你的函数中 return UIImage,因为你正在执行异步方法(即数据是 return 稍后编辑的,即使你 return 从函数中立即)。因此,采用异步模式:

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

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

要在下载后更新图像,您可以像下面这样在 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
          }
    })
}