AVCaptureSession stopRunning挂起iOS8上的主线程

时间:2014-09-26 21:08:39

标签: ios objective-c ios8 avfoundation avcapturesession

这是针对iOS 8的。我注意到在调用AVCaptureSession stopRunning之后有一个严重的延迟,我很困惑为什么会发生这种情况。

相关代码:

static dispatch_queue_t _captureQueue;

@implementation myClass {
  AVCaptureSession *_session;
}

- (id)init {
  self = [super init];
  if (self) {
    // standard AVCaptureSession setup (I can put actual code in if need be)
    static dispatch_once_t queueOnce;
    dispatch_once(&queueOnce, ^{
        _captureQueue = dispatch_queue_create("com.myclass.captureQueue", DISPATCH_QUEUE_SERIAL);
    });
  }
}

- (void)start {
  if (!_session) return;

  dispatch_async(_captureQueue, ^{
    [self->_session startRunning];
  });
}

- (void)stop {
  if (!_session) return;

  // stopMethod#1
  //[_session stopRunning];

  // stopMethod#2
  //dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
  //  [self->_session stopRunning];
  //});

  // stopMethod#3
  dispatch_async(_captureQueue, ^{
    [self->_session stopRunning];
  });
}

stopMethod#3是我过去总是停止AVCaptureSessions的方式,也是目前导致我看到的延迟的方法。我想知道_captureQueue上是否有一个长时间运行的方法,并且当stopRunning被发送到它时导致延迟,但是在使用stopMethod#2时,我看到完全相同的延迟。我终于尝试在主线程上停止会话,我没有任何延迟。记住所有这些都是在iOS 8上。我抓住了一个带有iOS 7的设备并且使用了所有三个stopMethods我没有得到任何延迟(我只是拍照,所以我假设没有很多东西关掉)。

这对我来说非常困惑,因为文档说

- (void)stopRunning
  Discussion
    This method is used to stop the flow of data from the inputs to the outputs
    connected to the AVCaptureSession instance that is the receiver. This method
    is synchronous and blocks until the receiver has completely stopped running.

关于这个主题的几乎所有SO帖子都说不要在主线程上调用stopRunning。这是某种奇怪的iOS 8错误还是我错过了什么?

0 个答案:

没有答案