将文件上传到Firebase正在跳过代码行?

时间:2016-12-20 03:17:17

标签: ios swift firebase firebase-storage

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

所以发生了这样的事情,当用户点击保存按钮时会触发此功能。正如我在调试器中观察到的那样,调用了storageRef,但是从不调用if else语句。然后,在我的函数返回没有正确初始化的对象之后,它返回到具有正确值的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
    }

1 个答案:

答案 0 :(得分:0)

在这里考虑改变你的方法。按钮目标动作是典型的需要立即响应的解决方案。

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

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

我建议您重新设计解决方案,以确保只有在放置成功或失败时才会执行后续操作。请记住,网络流量意味着上传可能需要一些时间。如果要验证put是否成功完成或失败,只需在完成块内的适当位置添加断点,然后在具有/且无网络访问权限的设备上运行该方法(以测试两个代码流)。 / p>