2017-11-25 14 views
1

Ich habe eine Bild-Erkennungs-App, die CoreML verwenden. Und vom UI-Aspekt aus möchte ich zur Hauptansicht zurückkehren, nachdem ich ein Bild ausgewählt und das Ergebnis nach der Funktion detect() angezeigt habe. Jedoch, selbst wenn ich DispatchQueue.main verwende, zeigt es immer Ergebnis und Mainview gleichzeitig an. Wenn ich DispatchQueue.main von detect() verwende, kann es funktionieren. Aber ich denke, es sollte nicht dort sein. Und es gibt ein anderes Problem, das SVProgressHUD.show() nicht funktioniert.Wie verwende ich DispatchQueue in Swift 4.0

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) 
    } 
} 

Antwort

0

Wenn ich Ihre Frage richtig verstanden habe, können Sie wie unten ändern:

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) 
     } 
    } 
} 
Verwandte Themen