繁体   English   中英

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

[英]How can I obtain a value from a completion handler iOS Swift 3

有人可以建议或指导,我怎么能在下面的代码中返回在Location 1获得的ProfileImage并在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计算属性仅用于从用户默认值获取图像,并使用另一个异步函数来获取用户配置文件,如果它不是nil将从默认值返回图像,否则它将尝试下载图像。 像这样:

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

在示例中, getProfileImageprofileImage属性与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")
}

}

您可以使用return运算符

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(data:profileImage)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM