2016-11-30 10 views
0

「メインスレッドでMBProgressHUDにアクセスする必要があります。」 Webサービスからのデータがページにロードされると、MBProgressHUDを非表示にするとエラーが発生します。 これを解決するのを手伝ってください。数時間でこの問題に固執する。 私のコードは次のとおりです。'メインスレッドでMBProgressHUDにアクセスする必要があります。' - Swift 3

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

次のように私はのviewDidLoadでスピナーを開始しました:

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

助けてください。

編集:

これは、そのビューコントローラの私の全体のコードです:

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

コード内の他の場所でMBProgressHUDとやり取りしていないことは確かですか?まだ隠れていますか?それは即時ですか、またはコードが実行された後にいつか発生しますか? – toddg

+0

は数分でコード全体を投稿します – Mamta

+0

編集したコードを確認してください – Mamta

答えて

2

あなたのエラー処理のすべてのバックグラウンドからMBProgressHUDを非表示にしようとしています。メインスレッドに切り替えて修正してください。

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

**テストするコードをいくつか削除しました。

関連する問題