2017-11-25 5 views
1

CoreML을 사용하는 이미지 인식 응용 프로그램을 만들었습니다. 그리고 UI 측면에서, 내가 이미지를 선택하고 함수 detect()을 수행 한 후 결과를 보여 주면 메인 뷰로 돌아가고 싶습니다. 그러나, 내가 DispatchQueue.main을 사용하더라도 항상 동시에 결과와 메인 뷰를 보여줍니다. detect() 중에서 DispatchQueue.main을 사용하면 작동 할 수 있습니다. 그러나 나는 거기에 있지 않아야한다고 생각한다. 그리고 SVProgressHUD.show()이 작동하지 않는 또 다른 문제가 있습니다.Swift 4.0의 DispatchQueue 사용 방법

import UIKit 
import CoreML 
import Vision 
import SVProgressHUD 

class ViewController: UIViewController, UIImagePickerControllerDelegate, UINavigationControllerDelegate { 

    @IBOutlet weak var imageView: UIImageView! 

    @IBOutlet weak var cameraButton: UIBarButtonItem! 
    let imagePicker = UIImagePickerController() 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     imagePicker.delegate = self 


    } 

    func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) { 
     cameraButton.isEnabled = false 
     SVProgressHUD.show() 



     if let userPickedImage = info[UIImagePickerControllerOriginalImage] as? UIImage{ 

      imageView.image = userPickedImage 
      imagePicker.dismiss(animated: true, completion: nil) 


      let userPickedImage = info[UIImagePickerControllerOriginalImage] as! UIImage 
      guard let ciImage = CIImage(image: userPickedImage) else { 
       fatalError("WRONG") 
      } 
      detect(image: ciImage) 
     } 
    } 

    func detect(image: CIImage){ 

     guard let model = try? VNCoreMLModel(for: Inceptionv3().model) else { 
      fatalError("Loading CoreML Model Failed") 
     } 

     let request = VNCoreMLRequest(model: model) { (request, error) in 
      guard let results = request.results as? [VNClassificationObservation] else{ 
       fatalError("Model failed to process image") 
      } 
      if let firstResult = results.first { 
       let r = firstResult.identifier.split(separator: ",") 
       DispatchQueue.main.async { 
        self.cameraButton.isEnabled = true 
        SVProgressHUD.dismiss() 
        self.navigationItem.title = r.last?.description 
       } 
      } 
     } 


     let handler = VNImageRequestHandler(ciImage: image) 
     do{ 
      try handler.perform([request]) 
     } 
     catch { 
      print(error) 
     } 

    } 

    @IBAction func cameraTapped(_ sender: UIBarButtonItem) { 
     imagePicker.sourceType = .savedPhotosAlbum 
     imagePicker.allowsEditing = false 
     present(imagePicker, animated: true, completion: nil) 
    } 
} 

답변

0

내가 제대로 질문을 이해한다면, 당신은 아래와 같이 변경할 수 있습니다

func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) { 
    cameraButton.isEnabled = false 
    SVProgressHUD.show() 

    if let userPickedImage = info[UIImagePickerControllerOriginalImage] as? UIImage{ 
     imageView.image = userPickedImage 
     imagePicker.dismiss(animated: true) { 
     guard let ciImage = CIImage(image: userPickedImage) else { 
      fatalError("WRONG") 
     } 
     self.detect(image: ciImage) 
     } 
    } 
} 
관련 문제