我如何从完成处理程序中获取一个值iOS Swift 3
问题描述:
是否有人可以请建议或指导,我如何返回在Location 1
处获得的ProfileImage
,并将其返回到Location 2
。将不胜感激您的帮助。我已经去了其他的SO问题,但没有一个帮助我。我如何从完成处理程序中获取一个值iOS Swift 3
static var profileImage : UIImage{
get{
let defaults = UserDefaults.standard
guard let imageData = defaults.object(forKey: "profileImage") as? NSData else{
downloadAndSetProfileImage(completionHandler: { (profileImage) in
// LOCATION 1:
// PLEASE ADVISE HOW I CAN RETURN THE OBTAINED PROFILE IMAGE BELOW at LOCATION 2
})
}
// LOCATION 2:
// I would like to return the profileImage Here i.e. return profileImage
}
set (image){
let defaults = UserDefaults.standard
let imageData : NSData = UIImagePNGRepresentation(image)! as NSData
defaults.set(imageData, forKey: "profileImage")
}
}
答
static var profileImage : UIImage{
get{
let defaults = UserDefaults.standard
guard let imageData = defaults.object(forKey: "profileImage") as? NSData else{
downloadAndSetProfileImage(completionHandler: { (profileImage) in
// LOCATION 1:
return profileImage
})
}
// LOCATION 2:
return UIImage(data: (imageData as! NSData) as Data)
}
set (image){
let defaults = UserDefaults.standard
let imageData : NSData = UIImagePNGRepresentation(image)! as NSData
defaults.set(imageData, forKey: "profileImage")
}
}
答
您可以使用回位控制器
get{
let defaults = UserDefaults.standard
guard let imageData = defaults.object(forKey: "profileImage") as? NSData else{
downloadAndSetProfileImage(completionHandler: { (profileImage) in
return profileImage
})
}
return UIImage(data: (imageData as! NSData) as Data)
}
如果收到数据的值类型在completionHandler,你应该使用方法的UIImage(数据:profileImage)
答
您不应该将异步任务放入您的getter中。相反,您可以使用可选的profileImage
computed属性仅用于从用户默认值中获取图像,并创建另一个异步函数以获取用户配置文件,如果不是零,将从默认值返回图像,否则会尝试下载图像。就像这样:
static var profileImage : UIImage? {
get {
let defaults = UserDefaults.standard
guard let imageData = defaults.object(forKey: "profileImage") as? NSData else {
return nil
}
return UIImage(data: Data(referencing: imageData))
}
set {
let defaults = UserDefaults.standard
guard newValue != nil else {
defaults.removeObject(forKey: "profileImage")
return
}
let imageData = NSData(data: UIImagePNGRepresentation(newValue!)!)
defaults.set(imageData, forKey: "profileImage")
}
}
// Async function to retrieve profile image
func getProfileImage(completion: (_ image: UIImage?) ->()) {
guard ProfileAPI.profileImage == nil else {
completion(ViewController.profileImage!)
return
}
// Your image dowload funciton
SomeImageDownloader.downloadImage("imagePath") { downloadedImage in
completion(downloadedImage) // assuming downloadedImage can be nil
}
}
为了让你打电话给你的个人资料图片:
getProfileImage { (image) in
if let profileIage = image {
// do something with it
}
}
在这个例子中getProfileImage
结合profileImage
财产与downloadImage
。如果getProfileImage
有一个值,它将在完成关闭时立即传递它,否则它将调用downloadImage
并在任务结束时传递结果。底线,你有一个情况需要一个异步任务,所以你需要某种完成处理程序,如我的例子中的一个。