uploadTask 成功后,ref.downloadURL() 不执行或返回 url

Posted

技术标签:

【中文标题】uploadTask 成功后,ref.downloadURL() 不执行或返回 url【英文标题】:ref.downloadURL() not executing or returning url once uploadTask is success 【发布时间】:2020-07-07 00:24:18 【问题描述】:

目标:将数据上传到 Firebase 存储并返回公共下载链接的 url。问题:返回链接的函数没有更新我的导致我认为链接不可用或功能以某种方式出错的数据结构。代码

uploadTask.observe(.success) snapshot in
                uploadData["comments"] = "0"
                uploadData["likes"] = "0"
                uploadData["name"] = "JGTech"
                snapshot.metadata?.storageReference?.downloadURL(completion:  (url, err) in
                    if err != nil 
                        print(err!)
                    else
                        uploadData["image"] = url?.absoluteString
                    
                    uploadData["image"] = url?.absoluteString
                )

之后的数据结构: uploadData = ["name": "JGTech", "cmets": "0", "likes": "0"] 没有图片键值对。

[2020 年 7 月 7 日] 我尝试了实现此功能的不同变体,所有结果都表明此功能未执行。可能是因为这个函数是异步的。在 downloadURL 行做了一个断点,这个函数被完全跳过了。

【问题讨论】:

请编辑问题以说明您如何观察到您的数据结构未更新。请记住,downloadURL 是异步的,不会立即完成。 什么是uploadData? uploadData 是未填充图像键值对的数据结构 @DougStevenson 如何等到下载链接准备好?有没有可以使用的等待函数或 for 循环? 【参考方案1】:

我不确定为什么这会起作用,而不是相反。似乎我必须在定义了变量 linkString 的块中执行所有逻辑

            uploadTask.observe(.success) snapshot in
                var linkString: String = ""
                uploadData["comments"] = "0"
                uploadData["likes"] = "0"
                uploadData["name"] = "JGTech"
                ref.downloadURL(completion:  (url, err) in
                    if err == nil 
                        if let link = url 
                            linkString = link.absoluteString
                            uploadData["image"] = linkString

【讨论】:

以上是关于uploadTask 成功后,ref.downloadURL() 不执行或返回 url的主要内容,如果未能解决你的问题,请参考以下文章

putString() 中的 UploadTask 出现问题

Firebase 存储等待 uploadTask.onComplete 已过时

Flutter -> UploadTask 方法 OnComplete 不存在

iOS:didCompleteWithError、didReceive 响应未由 URLSession.uploadTask 触发

如何从 Firebase Storage 获取下载网址?

网址未定义。重构为新版本的 angularfire, angular