2017-07-13 3 views
0

J'ai une application iOS Swift qui utilise les fonctionnalités de la caméra et de la photothèque avec UIImagePicker. L'utilisateur peut sélectionner des photos de la bibliothèque ou prendre une photo, qui sera ensuite ajouté à ma matrice d'images. Cependant, lorsque l'utilisateur sélectionne la photo qu'il souhaite utiliser dans le sélecteur ou appuie sur le bouton Utiliser photo, mon application prend environ 2 secondes pour traiter cette image et le sélecteur ne la ferme pas avant cela. Je souhaite donc ajouter un indicateur d'activité pour informer l'utilisateur que l'image a déjà été sélectionnée et qu'elle est en cours de traitement. Mais je ne sais pas comment faire ça. Je sais comment afficher et masquer les indicateurs d'activité avec UIButtons, mais comment puis-je masquer l'indicateur d'activité une fois le temps de traitement écoulé?Comment rejeter un indicateur d'activité après le temps de traitement dans Swift?

func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) { 
    //Adds photo to image array 
    //Takes a very long time to process. 
    self.dismiss(animated: true, completion: nil) 
} 

Répondre

1

Pour les utilisateurs, 2 secondes est un peu long, et pour le système iOS, 2 secondes est tooooooooooooo longtemps pour occuper le fil conducteur.

Que vous souhaitiez afficher un indicateur d'activité ou non, vous ne devriez pas appeler une telle tâche fastidieuse dans le thread principal. Et le faire dans un thread d'arrière-plan est également nécessaire pour mettre à jour les éléments de l'interface utilisateur (y compris afficher/masquer/animer UIActivityIndicatorView) correctement.

Votre code deviendrait quelque chose comme ceci: (. En supposant UIActivityIndicatorView est configuré dans le story-board avec son hidesWhenStopped ensemble et relié à un @IBOutletactivityIndicator)

func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) { 
    DispatchQueue.global(qos: .userInitiated).async { 
     DispatchQueue.main.async { 
      //UI updates needs to be done in the main thread 
      self.activityIndicator.startAnimating() 
      //Other UI updates & setups needed for mutual exclusion 
     } 

     //### In a background thread... 
     //Adds photo to image array 
     //Takes a very long time to process. 

     DispatchQueue.main.async { 
      //Reset mutual exclusion & restore UI state 
      self.activityIndicator.stopAnimating() 
     } 
    } 

    picker.dismiss(animated: true, completion: nil) 
}