UITableView重新加载不使用DispatchQueue.main.async更新tableview

时间:2018-05-22 08:25:16

标签: ios swift xcode uitableview grand-central-dispatch

我已经用swift4编写代码并在iPhone模拟器上运行。

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

以上代码有以下操作

Stoping Activity指标并在数据填充数据后更新TableView ..

但预计不会发生..

我得到了以下

  1. 活动指示器已停止,但指示灯未停止 已移除,背景视图未删除。
  2. TableView未更新。
  3. 我用过的代码:

     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
    }
    

    我创建了activityStopAnimating和activityStartAnimating作为扩展

3 个答案:

答案 0 :(得分:0)

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

您的代码应该适用于tableView重新加载,但您也可以尝试使用beginUpdates()endUpdates()方法。和stopActivityindicator调用stopAnimating(),然后隐藏你的activityindicator,这段代码应该适合你

享受编码。

答案 1 :(得分:0)

要重新加载tableView ,如果此数组是您的数据源,则必须确保self.capsulleDetail数据已更改 我认为它没有改变或仍然为零所以reloadData()将什么都不做

要隐藏指标,您应设置此属性以在停止时隐藏它,或者通过sting is-hidden to true将其隐藏

self.activityIndicator.hidesWhenStopped = true

答案 2 :(得分:0)

我找不到任何正确的解决方案来完美地做到这一点。

经过长时间的努力,我决定做以下事情并且它正在按照我的预期工作......

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

                    }

感谢您的所有答案......我正在等待完美答案..