当我加载屏幕时出现此问题我启动了一个活动指示器并调用一个函数来获取数据。首先显示活动,但从未开始,然后我在另一个线程中运行每个调用(启动活动和获取数据)。动画工作但只有一次,当我尝试加载屏幕时,它再次卡住,直到数据加载。 这是viewDidLoad:
import MySQLdb
db = MySQLdb.connect( host = '127.0.0.1', port=3307, user = 'root',
passwd = 'root', db = 'root')
cursor = db.cursor()
db.close()
屏幕卡住时的屏幕截图:
编辑:获取数据的功能:
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()
}
}
}
答案 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()
}
}
}
您应该对其他两个功能进行相同的更改。