无法将表达式类型 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
}
错误报告说 sendAsynchronousRequest
的 completionHandler
被定义为传递给您 response
、data
和 error
对象,但是它期望 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
}
})
}
我有一个问题,我正在尝试创建一个接受 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
}
错误报告说 sendAsynchronousRequest
的 completionHandler
被定义为传递给您 response
、data
和 error
对象,但是它期望 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
}
})
}