2017-04-16 24 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(尽管我猜你并没有在你的应用中超频地切换用户),并且要小心如果此上传呼叫在您不期望的时间完成,则可能会出现其他奇怪的情况。