简体   繁体   中英

UITableView Reload Not Updating the tableview with DispatchQueue.main.async

I have written code with swift4 and running on iPhone simulator.

DispatchQueue.main.async {
     self.view.activityindicatorStop()
     self.mytableView.reloadData()
}

Above code has following operation

Stoping Activity indicator and update TableView after data filling with array..

But expected does not happen..

I got following

  1. Activity indicator stoped but indicator not removed and background view not removed.
  2. TableView not updated.

code i have used:

 super.viewDidLoad()


        UserDefaults.lastAccessDate = Date()


        self.view.activityStartAnimating(activityColor: #colorLiteral(red: 0.9176470588, green: 0.2901960784, blue: 0.262745098, alpha: 1), backgroundColor: #colorLiteral(red: 1, green: 1, blue: 1, alpha: 0))

       //Calling the API  
      Capsulle.retriveSpaceTimeCapsulle { (data, respose, error) in
        if nil == error
        {
         let ServerData = serverComm.toJSONObject(with: data!)
         let result = ServerData.0 as? Array<Dictionary<String, Any>>
         self.capsulleDetail = result

        if (result == nil)
        {
            if false ==  loginCredential.isHavingAccessToken
            {
            loginCredential.isHavingAccessToken = false;
            UserDefaults.standard.set( "", forKey: "UserEmailID")
            let objStoryBoard:UIStoryboard = UIStoryboard.init(name: "Main", bundle: nil)
            let initialViewController:UIViewController = objStoryBoard.instantiateViewController(withIdentifier: "loginVC")

            self.present(initialViewController, animated: true, completion: {

            })

            return
            }
        }


         DispatchQueue.main.sync {

            self.CapsulleCollectionView.reloadData()

            self.view.activityStopAnimating()

         }
         }

      }

    }

func activityStartAnimating(activityColor: UIColor, backgroundColor: UIColor) {
        let backgroundView = UIView()
        backgroundView.frame = CGRect.init(x: 0, y: 0, width: self.bounds.width, height: self.bounds.height)
        backgroundView.backgroundColor = backgroundColor
        backgroundView.tag = 475647

        var activityIndicator: UIActivityIndicatorView = UIActivityIndicatorView()
        activityIndicator = UIActivityIndicatorView(frame: CGRect.init(x: 0, y: 0, width: 50, height: 50))
        activityIndicator.center = self.center
        activityIndicator.hidesWhenStopped = true
        activityIndicator.activityIndicatorViewStyle = UIActivityIndicatorViewStyle.gray
        activityIndicator.color = activityColor
        activityIndicator.startAnimating()
        self.isUserInteractionEnabled = false

        backgroundView.addSubview(activityIndicator)

        self.addSubview(backgroundView)
    }

func activityStopAnimating() {
    if let background = self.viewWithTag(475647){

        background.removeFromSuperview()
    }
    self.isUserInteractionEnabled = true
}

i have created activityStopAnimating and activityStartAnimating as extensions

DispatchQueue.main.async {
    self.view.activityIndicator.stopAnimating()
    self.view.activityIndicator.isHidden = true
    self.mytableView.beginUpdates()
    self.mytableView.endUpdates()
}

your code should work for tableView reload but you can also try using beginUpdates() and endUpdates() method. and to stopActivityindicator call stopAnimating() and then hide your activityindicator this code should work for you

Enjoy coding.

For tableView to reload you have to make sure that self.capsulleDetail have data changed if this array is your data source i think it not changed or still zero so reloadData() will do nothing

To hide indicator you should set this property to hide it when stop or hide it directly by sting is-hidden to true

self.activityIndicator.hidesWhenStopped = true

I don't Find any correct solutions to do this perfectly..

after long run i decided to do following and it is working some what i expect..

DispatchQueue.main.async {
                        // now update UI on main thread

                        self.myTableView.reloadData()
                        self.myTableView.setContentOffset(CGPoint(x: 0, y: -1), animated: true)
                        self.view.activityStopAnimating()

                    }

Thanks for all of your answers..i am awaiting for perfect answer..

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM