将文件上传到 Firebase 会跳过代码行吗?

Uploading Files onto Firebase is skipping lines of code?

我对 swift 和 Firebase 比较陌生,但我确实遇到了一个奇怪的问题。在调试器中搞砸之后似乎发生的事情是以下函数似乎表现出奇怪的行为,例如跳过行 storageRef.put()

所以发生的事情是这样的,当用户点击保存按钮时触发这个函数。正如我在调试器中观察到的那样,调用了 storageRef 但从未调用 if else 语句。然后,在我的函数 returns 未正确初始化的对象之后,它 returns 进入具有正确值的 if else 语句......到那时已经太晚了,因为返回并上传了值到数据库已经不正确..

func toAnyObject() -> [String : Any] {
        beforeImageUrl = ""
        let storageRef = FIRStorage.storage().reference().child("myImage.png")
        let uploadData = UIImagePNGRepresentation(beforeImage!)
        storageRef.put(uploadData!, metadata: nil) { (metadata, error) in
            if (error != nil) {
                print(error)
            } else {
                self.beforeImageUrl = (metadata?.downloadURL()?.absoluteString)!
                print("upload complete: \(metadata?.downloadURL())")
            }
        }

        let firebaseJobObject : [String: Any] = ["jobType"          :  jobType! as Any,
                                                 "jobDescription"   :  jobDescription! as Any,
                                                 "beforeImageUrl"   :  beforeImageUrl! as Any,]
        return firebaseJobObject
    }

考虑改变一下您的方法。按钮目标操作是典型的需要立即响应的解决方案。

但是,当您涉及其他进程(通过网络),如上面的 - (FIRStorageUploadTask *)putData:(NSData *)uploadData 方法时,您必须使用某种形式的委托来执行延迟的操作,只要服务器端方法 returns a价值。

请记住,当您尝试使用上述方法时,它不适用于大文件。你应该使用 - (FIRStorageUploadTask *)putFile:(NSURL *)fileURL 方法。

我建议您修改解决方案以确保后续操作仅在 put 成功或失败时发生。请记住,网络流量意味着上传可能需要一些时间。如果你想验证 put 是否完成成功或失败,只需在完成块内的适当位置添加一个断点和 运行 设备上的方法 with/and 没有网络访问(测试两个代码流)。