Ich habe eine Funktion, um ein Foto mit der Kamera über die captureStillImageAsynchronouslyFromConnection()
- Methode aufzunehmen. Das aufgenommene Bild ist mein Rückgabewert für die capture()
- Methode.Wie bekomme ich das aufgenommene Foto zum Haupt-Thread?
Ich möchte das aufgenommene Foto in einer Variablen in meinem ViewController speichern und dann einen Übergang zu einem anderen ViewController durchführen, der das Foto zeigt. Das scheint nicht zu funktionieren, bekomme ich eine fatal error: unexpectedly found nil while unwrapping an Optional value
- Fehler.
Ich weiß, dass es wegen var photo: UIImage!
ist nil
, aber wie kann ich die Fotodaten in meinem Haupt-Thread vor dem Aufruf der performSegue...
Funktion bekommen?
Meine Fotofunktion (in meinem CameraSession-Klasse) und die Session-Warteschlange:
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!
}
Meine Funktion in der Viewcontroller-Klasse:
func capture() {
let photo = cameraSession.capture(saveToGallery: true)
performSegueWithIdentifier("showPhoto", sender: self) // This will switch to another ViewController, which shows the captured photo.
}
Das Bild wird nicht in einem Viewcontroller-Klasse genommen wird, so kann ich ein nicht hinzufügen Übergang zu ihm. Ist es möglich, meine Funktion zu zwingen, zu warten, bis "self.capturedImage" nicht null ist, und sie dann zurückzugeben? – user3653164
Ich würde etwas wie das, was Gargoyle beschreibt, empfehlen und einen Block als zweites Argument an deine Capture-Methode übergeben. Meine Antwort wurde aktualisiert, um diese Idee widerzuspiegeln. – J2K