如何从完成处理程序iOS Swift 3获取值

如何从完成处理程序iOS Swift 3获取值,ios,swift,swift3,closures,Ios,Swift,Swift3,Closures,有人可以建议或指导我如何返回在以下代码中的位置1获取的档案图像,并将其返回到位置2。非常感谢你的帮助。我也考虑过其他一些问题,但没有一个对我有帮助 static var profileImage : UIImage{ get{ let defaults = UserDefaults.standard guard let imageData = defaults.object(forKey: "profileImage") as? NSDa

有人可以建议或指导我如何返回在以下代码中的
位置1
获取的
档案图像
,并将其返回到
位置2
。非常感谢你的帮助。我也考虑过其他一些问题,但没有一个对我有帮助

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")
    }
}

}

您可以使用返回运算符

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
并在任务结束时传递结果。底线是,您有一种需要异步任务的情况,因此在某种情况下,您需要某种类型的完成处理程序,如我的示例中的一种

getProfileImage { (image) in
    if let profileIage = image {
        // do something with it
    }
}