活动指示器动画不起作用 - Swift

时间:2018-05-05 10:19:48

标签: ios iphone swift animation activity-indicator

当我加载屏幕时出现此问题我启动了一个活动指示器并调用一个函数来获取数据。首先显示活动,但从未开始,然后我在另一个线程中运行每个调用(启动活动和获取数据)。动画工作但只有一次,当我尝试加载屏幕时,它再次卡住,直到数据加载。 这是viewDidLoad:

    import MySQLdb 
     db = MySQLdb.connect( host = '127.0.0.1', port=3307, user = 'root', 
     passwd = 'root', db = 'root') 
     cursor = db.cursor()
     db.close()

屏幕卡住时的屏幕截图:

enter image description here

编辑:获取数据的功能:

override func viewDidLoad() {
    super.viewDidLoad()

    //indicator
    indicator = UIActivityIndicatorView(frame: CGRect(x: 0, y: 0, width: 50, height: 50))
    indicator.transform = CGAffineTransform(scaleX: 1.5, y: 1.5)
    indicator.color = commons.getButtonColor()
    indicator.center = self.view.center
    indicator.hidesWhenStopped = true
    self.view.addSubview(indicator)
    DispatchQueue.main.async {
        print("We finished that.")
        // only back on the main thread, may you access UI:
        self.indicator.startAnimating()
    }


    //connect to database
    commons.ref = Database.database().reference()

    //table view
    tableV.dataSource = self
    tableV.delegate = self
    tableV.tableFooterView = UIView()
    tableV.separatorStyle = .none
    tableV.allowsSelection = false

    //change left btn
    let leftButtonItem = UIBarButtonItem.init(
        title: "",
        style: .done,
        target: self,
        action: #selector(backButtonPressed)
    )
    leftButtonItem.image = UIImage(named:"back")
    leftButtonItem.tintColor = commons.getButtonColor()
    self.navigationItem.leftBarButtonItem = leftButtonItem

    //style
    self.title = flag

    DispatchQueue.main.async {
        //get values
        if(self.flag == "Accounts"){
            self.color = "d0f0dd"
            self.getAccounts()
        }else if(self.flag == "Loans"){
            self.color = "f8ff90"
           self.getLoans()
        }else if(self.flag == "Cards"){
            self.color = "ffa669"
            self.getCards()
        }
    }

}

1 个答案:

答案 0 :(得分:0)

所有3个功能都有一个常见错误。您没有在代码的所有可能分支上调用stopAnimating,因此如果使用error调用完成处理程序,则您的活动指示符将继续运行。

我不确定Firebase的完成处理程序是如何实现的,它们可能已经被分派到主队列,但为了绝对安全,我还建议将stopAnimating函数调用分派给主线程来制作确保您不会意外地尝试从后台线程更新UI。

func getAccounts(){
    commons.ref.child("Accounts").observeSingleEvent(of: .value, with: { (snapshot) in
        for item in snapshot.children {
            self.values.append(item as! DataSnapshot)
        }
        DispatchQueue.main.async{
            self.tableV.reloadData()
            self.indicator.stopAnimating()
        }
    }) { (error) in
        print(error.localizedDescription)
        DispatchQueue.main.async{
            self.indicator.stopAnimating()
        }
    }
}

您应该对其他两个功能进行相同的更改。