2016-11-30 1 views
0

Je reçois 'MBProgressHUD doit être accessible sur le thread principal.' erreur sur le masquage MBProgressHUD une fois la page est chargée avec des données du service Web. S'il vous plaît aidez-moi à résoudre ce problème. Coincé sur cette question depuis des heures maintenant. Mon code est:'MBProgressHUD doit être accessible sur le thread principal.' - Swift 3

   DispatchQueue.main.async { 
        self.spinnerActivity.hide(animated: true) 
        self.tableView.reloadData() 
        self.refreshControl.endRefreshing() 
       } 

j'ai commencé la fileuse dans viewDidLoad comme suit:

spinnerActivity = MBProgressHUD.showAdded(to: self.view, animated: true); 
    spinnerActivity.label.text = "Loading"; 
    spinnerActivity.detailsLabel.text = "Please Wait!!"; 

S'il vous plaît aider.

Edit:

Ceci est mon code ensemble de ce contrôleur de vue:

class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource { 

@IBOutlet weak var tableView: UITableView! 

var refreshControl: UIRefreshControl! 
var spinnerActivity: MBProgressHUD! = nil 

override func viewDidLoad() { 
    super.viewDidLoad() 

    refreshControl = UIRefreshControl() 
    refreshControl.tintColor = UIColor.green 
    refreshControl.attributedTitle = NSAttributedString(string: "Refreshing", attributes: [NSForegroundColorAttributeName: UIColor.white]) 
    refreshControl.addTarget(self, action: #selector(ViewController.refresh(sender:)), for: UIControlEvents.valueChanged) 
    tableView.addSubview(refreshControl) 

    spinnerActivity = MBProgressHUD.showAdded(to: self.view, animated: true); 
    spinnerActivity.label.text = "Loading"; 
    spinnerActivity.detailsLabel.text = "Please Wait!!"; 

    self.navigationItem.hidesBackButton = true 
    let newBackButton = UIBarButtonItem(title: "Back", style: UIBarButtonItemStyle.plain, target: self, action: #selector(ViewController.back(sender:))) 
    self.navigationItem.leftBarButtonItem = newBackButton 

    navigationItem.title = city.uppercased() 

    self.runWebService() 
} 

func runWebService(){ 


    let url = URL(string: "")!// have removed my url 

    let task = URLSession.shared.dataTask(with: url) { (data, response, error) in // URLSession.shared().dataTask(with: url) { (data, response, error) is now URLSession.shared.dataTask(with: url) { (data, response, error) 

     if error != nil { 
      self.spinnerActivity.hide(animated: true) 
      print(error) 
     } else { 
      if let urlContent = data { 
       do { 
        guard let jsonResult = try JSONSerialization.jsonObject(with: urlContent, options: JSONSerialization.ReadingOptions.mutableContainers) as? [AnyObject] else { 
         self.spinnerActivity.hide(animated: true) 
         return 
        } 
        //processing web service 
        //DispatchQueue.global(qos: .userInitiated).async { 
        DispatchQueue.main.async { 
         self.spinnerActivity.hide(animated: true) 
         self.tableView.reloadData() 
         self.refreshControl.endRefreshing() 
        } 
       } catch { 
        self.spinnerActivity.hide(animated: true) 
        print("JSON Processing Failed") 
       } 
      } 
     } 
    } 
    task.resume() 
} 

override func didReceiveMemoryWarning() { 
    super.didReceiveMemoryWarning() 
    // Dispose of any resources that can be recreated. 
} 

func back(sender: UIBarButtonItem) { 
    _ = navigationController?.popToRootViewController(animated: true) 
} 

func refresh(sender:AnyObject) { 
    //pull to refresh 
    self.runWebService() 
} 

//remaining are table view data source and delegate methods } 
+0

Est-ce qu'il se cache encore? Est-ce immédiat ou cela se produit-il après l'exécution de ce code? – toddg

+0

affichera tout le code dans quelques minutes – Mamta

+0

S'il vous plaît vérifier le code édité – Mamta

Répondre

2

Vous essayez de cacher la MBProgressHUD de l'arrière-plan dans l'ensemble de votre gestion des erreurs. Passez au fil principal pour corriger:

func runWebService(){ 

    let url = URL(string: "http://www.google.com")!// have removed my url 

    let task = URLSession.shared.dataTask(with: url) { (data, response, error) in // URLSession.shared().dataTask(with: url) { (data, response, error) is now URLSession.shared.dataTask(with: url) { (data, response, error) 

     if error != nil { 
      DispatchQueue.main.async { 
       self.spinnerActivity.hide(animated: true) 
      } 

      print(error) 
     } else { 
      if let urlContent = data { 
       do { 
        guard let jsonResult = try JSONSerialization.jsonObject(with: urlContent, options: JSONSerialization.ReadingOptions.mutableContainers) as? [AnyObject] else { 
         DispatchQueue.main.async { 
          self.spinnerActivity.hide(animated: true) 
         } 
         return 
        } 
        //processing web service 
        //DispatchQueue.global(qos: .userInitiated).async { 
        DispatchQueue.main.async { 
         self.spinnerActivity.hide(animated: true) 
        } 
       } catch { 
        DispatchQueue.main.async { 
         self.spinnerActivity.hide(animated: true) 
        } 
        print("JSON Processing Failed") 
       } 
      } 
     } 
    } 
    task.resume() 
} 

** Notez que j'ai supprimé une partie de votre code à tester. Etes-vous sûr de ne pas interagir avec MBProgressHUD ailleurs dans votre code?