Приложение iPhone фонарик падает при быстром нажатии кнопки - PullRequest
0 голосов
/ 21 января 2011

Мое приложение с фонариком работает отлично.По какой-то причине, каждый раз, когда я нажимаю на кнопку фонарика очень быстро, приложение просто зависает и ничего не делает.Кажется, что он зависает, когда я вызываю AVCaptureSession stopRunning.Вот код для моего метода переключения фонарик.Я также хочу, чтобы этот метод в конечном итоге вызывался для функции строба.

- (void)toggleFlashlight{

  if (isTorchOn) {

   // Start session configuration
   [session beginConfiguration];

   [device lockForConfiguration:nil];    
   // Set torch to on
   [device setTorchMode:AVCaptureTorchModeOn];

   [device unlockForConfiguration];
   [session commitConfiguration];

  [session startRunning];


 }
 else {
  [session stopRunning];
  [session release]; 
  session = nil;

  session = [[AVCaptureSession alloc] init];

  // Create device input and add to current session
  AVCaptureDeviceInput *input = [AVCaptureDeviceInput deviceInputWithDevice:device error: nil];
  [session addInput:input];

  // Create video output and add to current session      
  AVCaptureVideoDataOutput *output = [[AVCaptureVideoDataOutput alloc] init];
  [session addOutput:output];
  [output release];
 }
}

Ответы [ 3 ]

5 голосов
/ 01 ноября 2011

Вот более короткая версия, которую вы теперь можете использовать для включения или выключения светодиода:

- (void)torchOnOff: (BOOL) onOff
{
    AVCaptureDevice *device = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];
    if ([device hasTorch]) {
        [device lockForConfiguration:nil];
        [device setTorchMode: onOff ? AVCaptureTorchModeOn : AVCaptureTorchModeOff];
        [device unlockForConfiguration];
    }
}
5 голосов
/ 21 января 2011

Вы действительно понимаете, что делает код, который вы вставили выше, или вы скопировали его из другого места?

Потому что вы постоянно просите iOS создать сеанс захвата видео,затем включает свет.Создание сеанса захвата видео очень загружает процессор / память.Он никогда не был спроектирован или предназначен для быстрого использования - не существует «нормального» варианта использования, в котором пользователь пытался бы инициировать несколько сеансов захвата видео в течение нескольких секунд друг от друга.Вот почему вы получаете свои сбои.

0 голосов
/ 21 января 2011

Если ваше приложение вращается вокруг AVCaptureSession, у вас должен быть запущен один экземпляр сеанса AVCapture в течение всего жизненного цикла приложения и просто переключите факел в этом сеансе. Вы слишком усложняете вещи. Как уже упоминалось, НЕ продолжайте воссоздавать один и тот же сеанс. Это пустая трата ресурсов. Я рекомендую посмотреть видео WWDC '10 по этой теме и просмотреть демонстрационные проекты.

...