我想从Firebase下载并处理映像到辅助线程上的本地目录,然后更新UI。问题是firebase在主线程上完成返回,而不是在我的NSOperation正在执行的线程上。我想切换回我的NSOperation正在运行的线程。有没有办法实现它?
下面是示例代码,并提到了调用完成的线程。
[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.
}];
}];
}];
答案 0 :(得分:1)
有助于停止使用线程进行思考,并开始考虑队列。
具体来说,执行的线程超出主线程,无关紧要。但是,相关的是执行代码的队列以及该队列是并发还是串行执行。
因此,在您的情况下,FirebaseHelper对主队列的回调会立即将一个块或操作分派给您的后台计算队列。
在纯GCD队列案例中,它可能与dispatch_async()
一样简单,或者由于您使用NSOperation
,因此将操作添加到相应的NSOperationQueue
。
如果我向NSOperationQueue添加操作,则会有所不同 已经执行的那个。 Firebase将返回100个对象 这意味着已经有100个NSOperations,这就是 导致为每个人创建另一个子操作
如果你的操作队列是串行的,那么操作将一个接一个地执行,实际上好像它是同一个线程(实际的执行线程是无关的)。
然而,即使在串行队列中,您也不希望在飞行中有100或数千个操作。
您需要将工作与工作的执行分开。也就是说,您需要存储需要在数据模型中完成的工作的表示,然后在工作队列或工作队列(如果并行化有意义)被清空时选择要执行的工作。