0

在应用程序的初始化过程中,我自然有一些关键的事情需要完成才能让应用程序运行。例如,在这种情况下,我需要获取AVCaptureDevice后置摄像头的指针。

因此,如果它失败了(它永远不应该,但你永远不知道),我想UIAlertView只显示一个选项,“再试一次”。当用户选择此项时,应用程序将尝试AVCaptureDevice再次获取。

问题是我需要等待用户在继续之前按“重试”,但UIAlertView不是模态的。

如果只有一段这样的代码,我可以通过UIAlertViewDelegate回调处理它。但是由于会有多个像这样的关键初始化部分,我看不出如何使用回调而不会使事情变得非常混乱。

有没有一种优雅的方法来处理这个?

编辑:一些代码:

- (void)setup
{
    NSError *error = nil;

    // get all the video devices. (this should be the back camera and the front camera.)
    NSArray *videoDevices = [AVCaptureDevice devicesWithMediaType:AVMediaTypeVideo];

    AVCaptureDevice *backVideoDevice;

    // find the back camera.
    do 
    {
        for (AVCaptureDevice *videoDevice in videoDevices)
        {
            if (videoDevice.position == AVCaptureDevicePositionBack)
            {
                backVideoDevice = videoDevice;

                break;
            }
        }

        if (backVideoDevice == nil)
        {
            // display UIAlertView???
        }

    } while (backVideoDevice == nil);

    // if no back camera was found, then we can't continue.

    AVCaptureDeviceInput *videoDeviceInput = [AVCaptureDeviceInput deviceInputWithDevice:backVideoDevice error:&error];

    AVCaptureStillImageOutput *stillImageOutput = [AVCaptureStillImageOutput new];

    AVCaptureSession *captureSession = [AVCaptureSession new];

    if ([captureSession canAddInput:videoDeviceInput])
    {
        [captureSession addInput:videoDeviceInput];
    }

    if ([captureSession canAddOutput:stillImageOutput])
    {
        [captureSession addOutput:stillImageOutput];
    }

    // etc, etc.
}

大多数步骤都需要检查它们是否成功,就像第一个一样。

4

1 回答 1

0

只需有一个这样的初始化方法:

- (void)initDevice {
  // If x device is not already initialized
  if (!_x) {
    _x = ...

    if (/* some error with _x initialization */) {
      // Show the alert view
      ...

      // Exit initialization
      return;
    }
  }

  ...
}

并在要开始初始化的地方和 UIAlertViewDelegate 回调中调用此方法。

如果其中一个变量已经初始化,则由于 if 语句,它将不会再次初始化。

您还可以在传递的每个步骤中设置一个名为 step 的 int 变量,并检查 step 变量以了解您需要在哪里继续初始化。

于 2012-05-31T23:11:45.987 回答