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

标签 xcode swift parse-platform

我有一个问题,我正在尝试创建一个接受 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
}

最佳答案

错误报告 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

关于xcode - 无法将表达式类型 UIImage 转换为类型 void swift,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28271457/

相关文章:

swift - 如何为标签添加约束?

iOS 9 和 NSAppTransportSecurity

objective-c - Xcode 更新后应用程序崩溃

ios - GVRSDK 与 GVRKit。什么时候将每一个用于 3D VR 视频?

python - 获取 HTML 中的 Python 脚本返回

ios - 在 tableView :cellForRowAtIndexPath 中使用子类 PFObject

swift - 解析和 Swift : Column with multiple keys

c++ - 如何从 Objective C 调用我的 Qt/C++ Dylib?

ios - 代码签名错误 - XCode 4.5 - iOS 6

ios - 使用 uid 作为属性创建 segue