有人可以建议或指导,我如何在下面的代码中返回在 ProfileImage
获得的 Location 1
并在 Location 2
返回它。非常感谢您的帮助。我已经解决了其他 SO 问题,但没有一个对我有帮助。
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")
}
}
最佳答案
你不应该把异步任务放到你的 getter 中。相反,您可以使用可选的 profileImage
计算属性仅用于从用户默认值获取图像,并创建另一个异步函数来获取用户配置文件,如果它不为零,它将从默认值返回图像,否则它将尝试下载一个。像这样:
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
并在任务结束时传递结果。最重要的是,您遇到了需要异步任务的情况,因此以一种或另一种方式,您需要某种完成处理程序,例如我的示例中的一种。关于ios - 如何从完成处理程序 iOS Swift 3 获取值,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/46987247/