可能有人请建议或指导,我怎么能回到我在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")
}
}
你不应该把异步任务到您的吸气剂。相反,你可以用你的选购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
并会把结果当任务结束。底线是,你必须在需要异步任务的情况,所以在这种或那种方式,你需要某种完成处理程序,如一个在我的例子。
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)