2017-04-16 30 views
0

因此,我通過imageURL將圖像發送到存儲器,但是當我嘗試將該imageURL發佈到FIRDataBase時,它會將其作爲「」或者當我設置一些條件邏輯以查看圖像是否已被選中時要做第一次登錄過程中兩次,任何人都可以幫我這個問題是在getUserNameAlert()功能相信:如何使用Swift擊敗Firebase中的異步問題?

func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) { 

     if let image = info[UIImagePickerControllerEditedImage] as? UIImage{ 
      let imguid = NSUUID().uuidString 
      let metadata = FIRStorageMetadata() 
      metadata.contentType = "image/jpeg" 

      var userImagesRef = DataService.ds.REF_USER_IMAGES.child(imguid).put(UIImageJPEGRepresentation(image, 0.2)!, metadata: metadata, completion: { (metadata, error) in 
       if error != nil{ 
        print("AA: able to upload image to FIREBASE STORAGE") 
       }else{ 
        print("GREAT SUCCESS FOR THE STORAGE") 
        imageSelected = true 
        let downloadURL = metadata?.downloadURL()?.absoluteString 
        if let url = downloadURL{ 
         userImageURL = url 
        } 
       } 
      }) 

     }else{ 
      print("AA: Valid image wasn't selected") 
     } 
     imagePicker.dismiss(animated: true, completion: nil) 

    } 


func getUserNameAlert(user:FIRUser, provider: String){ 

      let alert = UIAlertController(title: "Create a User Name", message: "Enter Your Desired User Name", preferredStyle: .alert) 
      alert.addTextField { (textField) in 
       textField.placeholder = "Enter User Name" 
       alert.addAction(UIAlertAction(title: "Create", style: .default, handler: { (action) in 
        if let textFields = alert.textFields{ 
         let theTextFields = textFields as! [UITextField] 
         userName = theTextFields[0].text! 
         self.present(self.imagePicker, animated: true, completion: nil) 
         if imageSelected == true{ 
         self.completeSignIn(id: user.uid, userdata: ["provider":provider,"userName":userName,"imageURL":userImageURL]) 
         } 
        } 

       })) 
       self.present(alert, animated: true, completion: nil) 
      } 
     } 

和userNameURL是String類型的全局變量

回答

1

所以問題是這些線...

self.present(self.imagePicker, animated: true, completion:  
if imageSelected == true { 
self.completeSignIn(id: user.uid, userdata: ["provider":provider,"userName":userName,"imageURL":userImageURL]) 
} 

問題是,你的代碼將會調出imagePicker,然後它的立即去運行接下來的幾行來查看imageSelected == true。它不會等待用戶完成圖像選擇器,這可能是您希望發生的事情。

有很多不同的方法可以解決這個問題,所有這些取決於您的最佳用戶體驗。但這裏有幾個策略,你可以嘗試:

戰略一個:移動completeSignIn讓你在imagePickerController: didFinishPickingMedia...方法調用它。當您有downloadURL可用時,您需要在成功上傳圖像後調用它。 (然後,要完成,您還需要在您的imagePickerController: didCancel方法中調用它。)這將起作用,但有一個缺點,即在圖像上傳之後,您將無法呼叫completeSignIn,這可能需要很長時間在慢速網絡上。

策略二:運行completeSignIn就像你正在做,但隨後追溯調整當前用戶的imageURL當你全部完成從上傳方法取回。這將如何工作具體取決於您在completeSignIn調用中所做的工作。

這樣做的好處是您不再通過等待用戶上傳巨型圖像來阻止您的呼叫。這對你來說意味着更多的工作,但是,要確保你爲正確的用戶調整了正確的imageURL(儘管我猜你並沒有在你的應用中超頻地切換用戶),並且要小心如果此上傳呼叫在您不期望的時間完成,則可能會出現其他奇怪的情況。