我如何从完成处理的iOS斯威夫特3获得价值

问题描述 投票:4回答:3

可能有人请建议或指导,我怎么能回到我在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")
    }
}
ios swift swift3 closures
3个回答
1
投票

你不应该把异步任务到您的吸气剂。相反,你可以用你的选购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结合profileImagedownloadImage财产。如果getProfileImage有值,它将立即通过它完成关闭,否则它会调用downloadImage并会把结果当任务结束。底线是,你必须在需要异步任务的情况,所以在这种或那种方式,你需要某种完成处理程序,如一个在我的例子。


0
投票
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")
}

}


-1
投票

您可以使用回位控制器

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)

© www.soinside.com 2019 - 2024. All rights reserved.