gpt4 book ai didi

ios - Swift 中的异步 NSOperation 依赖

转载 作者:可可西里 更新时间:2023-11-01 02:16:24 31 4
gpt4 key购买 nike

我正在制作一个使用 Firebase 的 iOS 应用程序,但是在我的应用程序的某个时刻,用户将帖子上传到数据库,该帖子应该包含用户上传的照片的 Firebase 存储 URL。所有这些操作都是一次完成的,所以我得到了 URL 的字典值的 nil 值,因为该过程是异步的并且是在一个称为上传的函数中立即完成的。那么我如何获取 URL 值,然后将其发布到其他操作而不获取 nil 值,即崩溃

var queue = NSOperationQueue()

let uploadToStorageOperation = NSBlockOperation(block: {

eventImagesRef.putData(self.imageData!, metadata: metadata).observeStatus(.Success) { (snapshot) in

let downloadTxt = snapshot.metadata!.downloadURL()!.absoluteString

self.downloadURL = downloadTxt
print(self.downloadURL)
}
})


/*uploadToStorageOperation.setCompletionBlock{(
if downloadURL != nil { queue.addOperation(uploadEventOperation) }
})*/


let uploadEventOperation = NSBlockOperation(block: {

let key = self.ref.child("events").childByAutoId().key
let event: [String: AnyObject] = ["eventID": eventID,
"host": host!,
"eventDescription": self.eventDescription.text!,
"location": [ "latitude": self.latitude, "longitude": self.longitude],
"eventPhotoURL": self.downloadURL! //error is here nil value

]
let childUpdates = ["/events/\(key)": event,
"/user-events/\(host!)/\(key)": event]
self.ref.updateChildValues(childUpdates)

})

uploadEventOperation.addDependency(uploadToStorageOperation)


queue.maxConcurrentOperationCount = 1
queue.addOperations([uploadToStorageOperation,uploadEventOperation], waitUntilFinished: false)

最佳答案

这是我怀疑正在发生的事情:

您的第一个 uploadToStorageOperation 运行一个 block ,该 block 本身调用带有完成 block 的异步方法 (eventImagesRef.putData())。 downloadURL 属性是从此完成 block 内部设置的。

您的第二个 uploadEventOperation 执行一个尝试访问 downloadURL 属性的 block 。您已将 uploadEventOperation 配置为仅在 uploadToStorageOperation 完成后运行;但是,uploadToStorageOperation 完成 之前 它在其自己的 block 中调用的异步方法完成,之前 设置 downloadURL 的完成 block 被执行。

换句话说,时间线看起来像这样:

  • uploadToStorageOperation 已执行

  • eventImagesRef.putData() 被异步调用

  • uploadToStorageOperation 返回并“完成”

  • uploadEventOperation 已执行

  • downloadURL 访问,没有设置值所以是nil

  • eventImagesRef.putData() 异步完成并调用其完成 block

  • downloadURL 已设置

有很多方法可以实现这一点,例如为存储操作子类化 NSOperation 并仅在 eventImagesRef.putData() 异步之后将其设置为完成调用完成。或者,您可以在 uploadToStorageOperation block 内使用分派(dispatch)信号量来强制该线程在 block 返回之前等待 eventImagesRef.putData() 方法完成。

无论如何,关键是要意识到,仅仅因为带有 block 的 NSOperation 完成,并不意味着从该 block 内启动的任何异步任务也已完成。

关于ios - Swift 中的异步 NSOperation 依赖,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38063316/

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