我如何从完成处理程序中获取一个值iOS Swift 3

我如何从完成处理程序中获取一个值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并在任务结束时传递结果。底线,你有一个情况需要一个异步任务,所以你需要某种完成处理程序,如我的例子中的一个。