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

时间:2017-10-27 08:36:45

标签: ios objective-c firebase nsoperationqueue

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

  1. 从Firebase Realtime DB下载元数据
  2. 处理并存储在本地Db
  3. 更新用户界面
  4. 从Firebase下载图片到临时位置
  5. 正确下载后移至相应目录
  6. 更新用户界面
  7. 下面是示例代码,并提到了调用完成的线程。

        [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. 
    
    
                    }];
    
            }];
    
     }];
    

1 个答案:

答案 0 :(得分:1)

有助于停止使用线程进行思考,并开始考虑队列

具体来说,执行的线程超出主线程,无关紧要。但是,相关的是执行代码的队列以及该队列是并发还是串行执行。

因此,在您的情况下,FirebaseHelper对主队列的回调会立即将一个块或操作分派给您的后台计算队列。

在纯GCD队列案例中,它可能与dispatch_async()一样简单,或者由于您使用NSOperation,因此将操作添加到相应的NSOperationQueue

  

如果我向NSOperationQueue添加操作,则会有所不同   已经执行的那个。 Firebase将返回100个对象   这意味着已经有100个NSOperations,这就是   导致为每个人创建另一个子操作

如果你的操作队列是串行的,那么操作将一个接一个地执行,实际上好像它是同一个线程(实际的执行线程是无关的)。

然而,即使在串行队列中,您也不希望在飞行中有100或数千个操作。

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