gpt4 book ai didi

ios - 从主队列切换到当前 NSOperation 线程

转载 作者:搜寻专家 更新时间:2023-10-30 20:23:57 25 4
gpt4 key购买 nike

我想在辅助线程上从 Firebase 下载图像并处理到本地目录,然后更新 UI。问题是 firebase 在主线程上完成返回,而不是在执行我的 NSOperation 的线程上返回。我想切换回我的 NSOperation 正在运行的线程。有什么办法可以实现吗?

  1. 从 Firebase 实时数据库下载元数据
  2. 在本地数据库中处理和存储
  3. 更新用户界面
  4. 从 Firebase 下载图片到临时位置
  5. 一旦正确下载移动到适当的目录
  6. 更新用户界面

下面是示例代码,并提到了调用完成的线程。

    [photosDetailReferenceDB observeEventType:FIRDataEventTypeValue  withBlock:^(FIRDataSnapshot * _Nonnull snapshot) {

//Main Thread

[self.downloadQueue addOperationWithBlock:^{

//Bg Thread 2

[[[FirebaseHelper sharedManager].storageuserRef child:serverPath] writeToFile:[NSURL fileURLWithPath:tempPath] completion:^(NSURL * _Nullable URL, NSError * _Nullable error) {

//Main Thread
// Here I want to switch back to Thread 2.
// Since yet I have to move the image back to proper directory and update the image status in core data.


}];

}];

}];

最佳答案

它有助于停止从线程的角度思考,而开始从队列的角度思考。

具体来说,执行的线程在主线程之外是无关紧要的。不过,相关的是执行代码的队列以及该队列是并发执行还是串行执行。

因此,在您的情况下,FirebaseHelper 对主队列的回调将立即向您的后台计算队列分派(dispatch)一个 block 或操作。

在纯 GCD 队列情况下,它可能与 dispatch_async() 一样简单,或者,由于您使用的是 NSOperation,因此向适当的 NSOperationQueue 添加一个操作


If I add an operation to NSOperationQueue it would be different then the one already executing. Firebase will be returning 100's of object that means there would be 100's of NSOperations already and this would lead to create another sub operation for each of them

如果您的操作队列是串行的,那么操作将一个接一个地执行,就好像它们是同一个线程一样有效(实际执行的线程无关紧要)。

但是,您不希望有数百或数千个操作在运行中,即使在串行队列中也是如此。

您需要将工作与工作的执行分开。也就是说,您需要在您的数据模型中存储需要完成的工作的表示,然后在您的一个或多个工作队列(如果并行化有意义)被清空时挑选要执行的工作。

关于ios - 从主队列切换到当前 NSOperation 线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46970825/

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