gpt4 book ai didi

ios - 无法在 Firebase API 回调 block 中的函数内赋值

转载 作者:行者123 更新时间:2023-11-28 12:28:17 24 4
gpt4 key购买 nike

我正在尝试在 Xcode 8 上使用 Swift 创建此函数。在使用 firebase 函数获得 url 后,我无法将 url 值分配给 imageURL.

我尝试了一种解决方法 - 将 imageURL 放在函数之外,并将 url 函数分配给 self.imageURL,它完美地工作。但是,我试图将其设为静态函数,因此我无法使用该解决方法。有谁知道如何解决这个问题?

func createImageDownloadURL(path: String) -> URL? {
// Create a reference to the file you want to download
let storage = FIRStorage.storage()
let storageRef = storage.reference()
let imageRef = storageRef.child(path)
var imageURL: URL?

// Fetch the download URL

imageRef.downloadURL { (url: URL?, error: Error?) in
if error != nil {
// Handle any errors
print(error!)
} else {
// Get the download URL for image
DispatchQueue.main.async {
// Run UI Updates
print(imageURL) // output looks perfectly fine
imageURL = URL(string: url!.absoluteString) // This is where the problem is
}
}
}
print(imageURL) // output is "nil"
return imageURL
}

最佳答案

这就是你需要的:)

func createImageDownloadURL(path: String,completionBlock : @escaping (URL?) -> ()) {
// Create a reference to the file you want to download
let storage = FIRStorage.storage()
let storageRef = storage.reference()
let imageRef = storageRef.child(path)
var imageURL: URL?

// Fetch the download URL

imageRef.downloadURL { (url: URL?, error: Error?) in
if error != nil {
// Handle any errors
print(error!)
} else {
// Get the download URL for image
DispatchQueue.main.async {
// Run UI Updates
print(imageURL) // output looks perfectly fine
imageURL = URL(string: url!.absoluteString) // This is where the problem is
completionBlock(imageURL)
}
}
}
}

您的代码有什么问题?

imageRef.downloadURL { 和 DispatchQueue.main.async { 都是异步执行的。所以 return imageURL 甚至在任何这些 block 完成执行之前就被执行了 :)

解决方案:

解决方案一:

您可以使用闭包 :) 您可以接受一个 block /闭包作为您的函数参数之一,并在您获得 imageURL 时异步执行它 :)

解决方案 2:

您可以使用协议(protocol)/委托(delegate)模式并调用委托(delegate)方法并将 imageURL 传递给委托(delegate):)

方案三:(不推荐)

如果你想不惜一切代价返回(虽然不建议)使用信号量并阻止线程的执行,一旦你有 imageURL 释放信号量并执行返回语句:)

关于ios - 无法在 Firebase API 回调 block 中的函数内赋值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42778908/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com