2016-07-02 5 views
0

画像をクリックするためのカスタムクラスを作成しようとしています。その中にclickPicture関数を作成して、UIImageを返します。ただし、captureStillImageAsynchronouslyvoidです。私はそれから受け取ったイメージをどのように返すことができますか?ありがとう。復帰機能の無効化

オプションをアンラップながら 予期しないゼロが見つかった後、比類のない#2スウィフト質問です
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

サイドノート:
あなたは完了ブロックを必要と運命のpuramidを避けてください。ビデオ接続とsampleBuffercanは両方とも 'if let'ではなく' guard let'でチェックされます。 – Alexander

+0

@AMomchilov何が違いですか?私は一般的に 'もしlet 'を使う。 – penatheboss

+0

本質的にこの問題と同じ問題:http://stackoverflow.com/questions/26569724/nsurlconnection-sendasynchronousrequest-cant-get-variable-out-of-closure –

答えて

2

。非同期静止画

キャプチャ:

方法はないが何であるかをかなりよく説明しています。

非同期タスクを含むメソッドから何も返すことはできません。

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) 

    }) 
} 

とこのようにそれを呼び出す:

clickPicture { image in 
    if unwrappedImage = image { 
    // do something with unwrappedImage 
    } 
} 
関連する問題