简体   繁体   English

UITableView重新加载未使用DispatchQueue.main.async更新表视图

[英]UITableView Reload Not Updating the tableview with DispatchQueue.main.async

I have written code with swift4 and running on iPhone simulator. 我已经用swift4编写了代码,并在iPhone模拟器上运行。

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.. 数组填充数据后,停止活动指示器并更新TableView

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. TableView未更新。

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 我已经创建了activityStopAnimating和activityStartAnimating作为扩展

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. 您的代码应该适用于tableView重新加载,但是您也可以尝试使用beginUpdates()endUpdates()方法。 and to stopActivityindicator call stopAnimating() and then hide your activityindicator this code should work for you 并要stopActivityindicator调用stopAnimating() ,然后隐藏您的activityindicator,此代码应为您工作

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 要重新加载tableView,必须确保self.capsulleDetail数据已更改(如果此数组是您的数据源),我认为它没有更改或仍为零,因此reloadData()不会执行任何操作

To hide indicator you should set this property to hide it when stop or hide it directly by sting is-hidden to true 要隐藏指示器,您应该将此属性设置为在停止时隐藏它,或者通过将is-hidden-hidden隐藏为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.. 感谢您的所有答复。.我正在等待完美的答复。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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