2017-10-28 3 views
4

誰かが提案したり、指導してもらえますか?を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") 
    } 
} 

答えて

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

}

0

あなたはあなたのcompletionHandler内のデータの値の型を受け取った場合、あなたは方法UIImage(データ: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) 
} 

を使用することができます

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

例でgetProfileImagedownloadImageprofileImage性質を兼ね備えています。 getProfileImageに値がある場合は、完了クロージャですぐに値を渡します。それ以外の場合はdownloadImageを呼び出し、タスクが終了したときに結果を渡します。一番下の行には、非同期タスクが必要な状況があるため、私の例のような何らかの補完ハンドラが必要です。

関連する問題