繁体   English   中英

iOS AVFoundation和多线程

[英]iOS AVFoundation and Multithreading

在苹果公司的AVFoundation演示的每个示例代码中,所有会话任务的单独队列。

dispatch_queue_t sessionQueue = dispatch_queue_create("session queue", DISPATCH_QUEUE_SERIAL);

这也用于观察焦点变化,曝光变化,白平衡变化等:

- (void)viewWillAppear:(BOOL)animated
{
     [super viewWillAppear:animated];
     dispatch_async([self sessionQueue], ^{
          [self addObservers];
          [[self session] startRunning];
     });
}

- (void)viewDidDisappear:(BOOL)animated
{
     dispatch_async([self sessionQueue], ^{
          [[self session] stopRunning];
          [self removeObservers];
     });
     [super viewDidDisappear:animated];

}

当我遵循此步骤时,一切都很顺利,直到我采用了第三方API“ GPUImage”。 我被告知,此api不需要多线程或单独的队列,因为它已在内部处理。 因此,我完全取出了“ sessionQueue”。

但是,现在我的应用程序运行起来非常混乱,我认为这是由于主队列要求处理大多数分支任务。

我可以有一个单独的队列来观察self.videoCamera的变化吗? 这样可以减轻mainQueue的大部分负担吗?

等一下,小玩意儿! 我没有说(我想你是说我)“不需要多线程或单独的队列”。 我说过,我不认为您在前面的问题中实际显示的(小)代码中需要它。

您也完全正确,Apple直接建议在后台线程上启动捕获会话。 正如他们在AVCamManual示例代码中的注释中明确指出的那样:

-[AVCaptureSession startRunning]是一个阻塞调用,可能需要很长时间。 我们将会话设置调度到sessionQueue,以便不阻塞主队列(这使UI保持响应状态)。

到现在为止还挺好。 但是我也说的是,我坚持这一点:多线程很难

让我们以这个新问题中的代码为例。 你是说:

 dispatch_async([self sessionQueue], ^{
      [[self session] stopRunning];
      [self removeObservers];
 });

现在,这可以说是一件好事,然后可能再也不是。 在Apple的示例代码中,决定在后台线程上启动捕获会话,从那时开始,他们小心地在该线程(队列)上触摸该捕获会话。 而且您似乎也在做同样的事情。 那很好。

但这不是您在后台线程中所做的全部 例如,我怎么知道您的removeObservers方法会发生什么? 如果它接触到self或任何其他对象的任何属性,或者它调用了执行此操作的任何方法,或者它调用了Cocoa的不是线程安全的任何部分(实际上可能是Cocoa的大部分 ),那么您当事情神秘而不可辩驳地出错时,您将面临严重的麻烦-如果不是为了您,那么(对于更糟糕的话)对于某些用户而言。 (当然,我只是忽略了,以除主线程之外的任何方式与应用程序接口进行任何连接的危险)。

以及我如何知道您在代码的其他部分还要做什么? Apple 在此后台线程中谨慎触摸[self session] 这是一个重要规则,也是良好的多线程技术的一部分。 但是知道这个规则吗? 是否曾经犯过在主线程或与此线程不同的其他线程上触摸[self session]的错误? 我怎么知道? 我不。

因此,再次总结一下, 只要您知道自己在做什么并且准备好承担后果 ,就可以随意使用多线程。 多线程很难 (糟糕,我又说了一遍。)

现在,也许您已经彻底审查了removeObservers方法(以及您正在此处从后台线程调用的所有其他方法)。 我猜想removeObservers可能会直接在Apple的示例代码中复制模型,在这种情况下,一切可能都还不错。 也许您是个很棒的多线程用户,我在这里所说的一切对您都是众所周知的,只是像鸭子背上的水一样被冲洗掉。 那很棒! 那么这些担忧对您而言就不是问题,您应该无视我的话。 简而言之,只要您知道自己在做什么并且不超出安全范围,就可以并且可能应该使用后台线程来处理捕获会话。 如果您知道这些界限是什么,那就太好了! 我的警告曾经是,现在是,以防万一您知道。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM