UIImagePickerController didFinishPickingMediaWithInfo иногда не вызывается

#ios #uiimagepickercontroller

#iOS #uiimagepickercontroller

Вопрос:

Привет, я создаю приложение altered reality. Мой основной контроллер является производным от UIImagePickerController. Вот как я его создаю:

 - (void)viewWillAppear:(BOOL)animated
{
    [super viewWillAppear:animated];
    if (!self.overlayController) {
        if ([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera]) {
            self.sourceType = UIImagePickerControllerSourceTypeCamera;
            self.cameraCaptureMode = UIImagePickerControllerCameraCaptureModePhoto;
            self.cameraDevice = UIImagePickerControllerCameraDeviceRear;

            self.showsCameraControls = false;
            self.allowsEditing = false;

            self.overlayController = [[[ControlsViewController alloc] initWithNibName:@"ControlsViewController" bundle:[NSBundle mainBundle] picker:self] autorelease];
            [self.view addSubview:self.overlayController.view]; // need to add as subview otherwise mouse events captured by UIImagePickerController
            self.overlayController.view.frame = CGRectMake(0,0, self.view.frame.size.width, self.view.frame.size.height);
        }
    }
    [cameraControls setCamera:self];
}
 

В основном контроллер существует на протяжении всего жизненного цикла приложения. Теперь, когда я делаю снимок с кодом ниже, большую часть времени он работает нормально, но иногда didFinishPickingMediaWithInfo не вызывается. Обычное поведение: я вижу, что фокус камеры начинает регулировать включение / выключение размытия, а затем стабилизируется, но didFinishPickingMediaWithInfo никогда не будет вызываться. Похоже, что если камера переходит в какой-то режим калибровки, это может не вызвать это событие. У кого-нибудь есть решение? Я надеюсь, что, возможно, есть какой-то дополнительный обратный вызов (например, обработка ошибок отсутствует).
Я даже слышу, как звук, имитируемый затворами камеры, прерывается, когда камера переходит в этот странный режим калибровки.

 //self.cameraPicker points to the instance of my main controller that I created earlier

-(void) setCamera:(UIImagePickerController *)picker {
    self.cameraPicker = picker;
    picker.delegate = self;
}

-(void) takePicture {
    [self.cameraPicker takePicture];
}
-(void) imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info {
    NSLog(@"Picture ready");
}
 

Комментарии:

1. Найден корень моей проблемы. Я вызывал функцию takePicture из потока таймера. Как только я переключился на получение его из обработчика событий нажатия кнопки, все работает нормально. Похоже, что-то неприятное происходит, если оно не в том же потоке? Я просто предполагаю здесь.