2016-07-02 7 views
0

Ich versuche, eine benutzerdefinierte Klasse zum Klicken auf Bilder zu erstellen. Innerhalb davon möchte ich eine clickPicture Funktion erstellen, die eine UIImage zurückgibt. Die captureStillImageAsynchronously ist jedoch eine void. Wie kann ich das von mir erhaltene Bild zurückgeben? Vielen Dank.Void innerhalb der Return-Funktion

func clickPicture() -> UIImage? { 

    if let videoConnection = stillImageOutput?.connection(withMediaType: AVMediaTypeVideo) { 

     videoConnection.videoOrientation = .portrait 
     stillImageOutput?.captureStillImageAsynchronously(from: videoConnection, completionHandler: { (sampleBuffer, error) -> Void in 

      if sampleBuffer != nil { 

       let imageData = AVCaptureStillImageOutput.jpegStillImageNSDataRepresentation(sampleBuffer) 
       let dataProvider = CGDataProvider(data: imageData!) 
       let cgImageRef = CGImage(jpegDataProviderSource: dataProvider!, decode: nil, shouldInterpolate: true, intent: .defaultIntent) 

       let image = UIImage(cgImage: cgImageRef!, scale: 1, orientation: .right) 

       return image //Unexpected non-void return value in void function 

      } 
      return nil //Unexpected non-void return value in void 

     }) 

    } 

    return nil 
} 
+1

Randbemerkung: Bitte vermeiden Sie die puramid des Schicksals. Videoverbindung und sampleBuffer können beide mit einem 'guard let' überprüft werden, anstatt mit einem' if let' – Alexander

+0

@AMomchilov was ist der Unterschied? Ich benutze im Allgemeinen 'wenn lassen'. – penatheboss

+0

Im Wesentlichen das gleiche Problem wie dieses: http://stackoverflow.com/questions/26569724/nsurlconnection-sendasynchronousrequest-cant-get-variable-out-of-closure. –

Antwort

2

, dass die unbestrittenen # 2 Swift Frage nach unerwartet null ist gefunden, während eine optionale auszupacken.

Die Methode beschreibt ziemlich gut, was tut, ist:

zur Bildaufnahme asynchron.

Sie können nichts von einer Methode zurückgeben, die eine asynchrone Task enthält.
Sie benötigen einen Abschluss Block:

func clickPicture(completion:(UIImage?) -> Void) { 

    guard let videoConnection = stillImageOutput?.connection(withMediaType: AVMediaTypeVideo) else { completion(nil) } 

    videoConnection.videoOrientation = .portrait 
    stillImageOutput?.captureStillImageAsynchronously(from: videoConnection, completionHandler: { (sampleBuffer, error) -> Void in 

     guard let buffer = sampleBuffer else { completion(nil) } 

     let imageData = AVCaptureStillImageOutput.jpegStillImageNSDataRepresentation(buffer) 
     let dataProvider = CGDataProvider(data: imageData!) 
     let cgImageRef = CGImage(jpegDataProviderSource: dataProvider!, decode: nil, shouldInterpolate: true, intent: .defaultIntent) 

     let image = UIImage(cgImage: cgImageRef!, scale: 1, orientation: .right) 

     completion(image) 

    }) 
} 

und rufen es auf diese Weise:

clickPicture { image in 
    if unwrappedImage = image { 
    // do something with unwrappedImage 
    } 
} 
Verwandte Themen