代码
class Trackbooking: UIViewController {
var bookid=String()
@IBOutlet weak var loadingBar: UIActivityIndicatorView!
override func viewDidLoad() {
super.viewDidLoad()
print("track\(bookid)")
loadingBar.startAnimating()
let query=PFQuery(className: "bookings")
query.whereKey("objectId", equalTo:bookid)
do {
var results=try query.getFirstObject()["Booked"] as! Int
print(results)
repeat{
sleep(2)
results=try query.getFirstObject()["Booked"] as! Int
print("wait for it")
}while results==0
} catch {
print("Unexpected non-vending-machine-related error: \(error)")
}
}
}
据我所知,视图是在视图集之后执行加载的,但是当我运行此代码时,我的视图仅在重复while语句之后显示,为什么呢,
答案 0 :(得分:0)
据我所知,视图集设置后是否执行了加载
是的!并且viewDidLoad
运行正常。但是,“已设置视图”仅意味着self.view
不会为零。这并不意味着您可以看到该视图。将视图保存在内存中并不意味着显示该视图。我可以像这样在内存中查看一个视图:
let view = UIView(frame: CGRect(x: 0, y: 0, width: 100, height: 100))
运行上述代码行后是否可以查看视图?不。
您应该在viewDidAppear
内编写代码:
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
let query=PFQuery(className: "bookings")
query.whereKey("objectId", equalTo:bookid)
do {
var results=try query.getFirstObject()["Booked"] as! Int
print(results)
repeat{
sleep(2)
results=try query.getFirstObject()["Booked"] as! Int
print("wait for it")
}while results==0
} catch {
print("Unexpected non-vending-machine-related error: \(error)")
}
}
使用sleep(2)
可能不是一个好主意,因为它会冻结应用程序,并且在此期间它无法响应用户交互,这会带来糟糕的用户体验。我建议您使用以2秒的固定速率安排的Timer
:
Timer.scheduledTimer(withTimeInterval: 2, repeats: true) { (timer) in
do {
var results=try query.getFirstObject()["Booked"] as! Int
print("wait for it")
if results != 0 {
timer.invalidate() // stops the timer
}
} catch {
print("Unexpected non-vending-machine-related error: \(error)")
}
}