2016-01-01 35 views
0

我有以下方法,主要使用username參數從後端Parse加載用戶的圖片。Swift - UIImage和Nil Value

func getProfilePicture(username: String) -> UIImage 
    { 
     var tempImage:UIImage = UIImage(named: "sample-qr-code.png")! 
     let query: PFQuery = PFQuery(className: "_User") 
     query.whereKey("appUsername", equalTo: username) 
     query.findObjectsInBackgroundWithBlock { 
      (objects:[PFObject]?, error:NSError?) -> Void in 
      for object in objects! { 

       let imageFiles = object["ProfilePic"] as! PFFile 

       imageFiles.getDataInBackgroundWithBlock({ 
        (imageData: NSData?, error: NSError?) -> Void in 
        if (error == nil) { 
         tempImage = UIImage(data:imageData!)! 
        } 

       }) 

      } 

     } 
     return tempImage 
    } 

在該方法的第一行,我的理由很簡單,它不能爲空值分配給tempImage否則它拋出零例外。當上面的代碼運行時,它會遍歷所有階段和條件(通過使用打印函數進行日誌記錄來檢測),但返回的圖像仍然是sample-qr-code.png,而不是數據庫中的那個。有沒有從後端拋出錯誤,該行被執行:

tempImage = UIImage(data:imageData!)! 

有人可以幫我解決這是爲什麼不顯示從後端的畫面?我猜測它可能與初始化和範圍有關,但不確定。

回答

1

這是因爲函數在閉包中的任務完成之前完成的。

您應該讓tempImage成爲自己的一個屬性,並讓閉包更新該屬性。

class SomeClass { 

    var tempImage: UIImage? 

    func someFuncToGetStuff() { 

     Parse.doParseStuffWithCompletion(fetchedPFFile) -> Void in 

      let myImage = UIImage(data: fetchedPFFile) 
      self.tempImage = myImage 

      } 

    } 

} 
+0

你能否詳細說明你在這裏的意思......它本身的屬性? –

+0

假設函數存在於仍在內存中引用的類中,如果將UIImage設置爲該類的屬性,那麼即使在啓動閉包的函數完成後,閉包內的任務也可以訪問它。 –

+0

在答案中增加了一個例子,顯然你想有條件地做東西(比如如果事情不是零等) –

1

query.findObjectsInBackgroundWithBlock在後臺運行。這意味着當你的函數返回時,它會有你最初分配給它的默認圖像。

tempImage可以立即重置或被攻擊,或者在getProfilePicture方法返回默認圖像後立即觸發,或最多一秒。

您需要重做如何獲取該圖像,例如(即通過findObjects:,可能很慢)或通過圖像視圖出口,並在後臺功能成功完成後立即將圖像寫入圖像視圖。

+0

這可以使用完成? –

+0

您需要將IBOutlet傳遞給getProfilePicture方法,或者將imageView屬性設置爲新創建的UIImage。 –