У меня есть функция для захвата фотографии с помощью камеры с помощью метода captureStillImageAsynchronouslyFromConnection()
. Захваченное изображение - мое возвращаемое значение для метода capture()
.Как получить снятое фото в основной поток?
Я хочу сохранить захваченную фотографию в переменную в моем ViewController, а затем выполнить segue в другой ViewController, который покажет фотографию. Это не работает, я получаю fatal error: unexpectedly found nil while unwrapping an Optional value
- Ошибка.
Я знаю, что это из-за var photo: UIImage!
, являющегося nil
, но как я могу получить фотоданные в свой основной поток перед вызовом функции performSegue...
?
Моя фотография функции (внутри моего CameraSession-класс) и сеанс-очередь:
var sessionQueue = dispatch_queue_create("CameraSession", DISPATCH_QUEUE_SERIAL)
func capture(saveToGallery save: Bool) -> UIImage {
var capturedImage = UIImage()
let connection = self.output.connectionWithMediaType(AVMediaTypeVideo)
connection.videoOrientation = .Portrait
dispatch_async(sessionQueue, {
self.output.captureStillImageAsynchronouslyFromConnection(
connection, completionHandler: {
(imageDataSampleBuffer: CMSampleBuffer?, error: NSError?) -> Void in
if imageDataSampleBuffer != nil {
let imageData: NSData = AVCaptureStillImageOutput.jpegStillImageNSDataRepresentation(imageDataSampleBuffer)
self.capturedImage = UIImage(data: imageData)
if save {
UIImageWriteToSavedPhotosAlbum(self.capturedImage!, nil, nil, nil)
}
}
}
)
})
return self.capturedImage!
}
Моей функция в ViewController-классе:
func capture() {
let photo = cameraSession.capture(saveToGallery: true)
performSegueWithIdentifier("showPhoto", sender: self) // This will switch to another ViewController, which shows the captured photo.
}
Изображение не принимается в ViewController-класса, поэтому я не могу добавить перейдите к нему. Можно ли заставить мою функцию ждать, пока 'self.capturedImage' не будет равен нулю, а затем вернет его? – user3653164
Я бы рекомендовал что-то вроде того, что описывает Гаргульи, передавая блок в качестве второго аргумента вашему методу захвата. Обновленный мой ответ, чтобы отразить эту идею. – J2K