【问题标题】:Switch from main queue to current NSOperation Thread从主队列切换到当前的 NSOperation 线程
【发布时间】:2017-10-27 08:36:44
【问题描述】:

我想将图像从 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. 


                }];

        }];

 }];

【问题讨论】:

    标签: ios objective-c firebase nsoperationqueue


    【解决方案1】:

    这有助于停止以 线程 的方式思考,而开始以 队列 的方式思考。

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

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

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


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

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

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

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

    【讨论】:

    • 如果我向 NSOperationQueue 添加一个操作,它将与已经执行的操作不同。 Firebase 将返回 100 个对象,这意味着已经有 100 个 NSOperations,这将导致为每个对象创建另一个子操作
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-23
    • 1970-01-01
    • 1970-01-01
    • 2017-10-26
    • 1970-01-01
    • 2013-11-03
    相关资源
    最近更新 更多