我在iOS上具有以下功能,可在TableView上执行UI工作,而挑战在于,如果开始花费更长的时间,则需要0.5秒。应向用户显示一个微调框,以使屏幕看起来不会冻结。
func updateForm(with rowItems: [RowItem]) {
self.tableView.beginUpdates() // performance tweak.
let viewControllerName = String.init(describing: self.classForCoder) // id
var defaultSection = Form.createSectionWith(tag: viewControllerName, in: form)
// MARK: - update rows
let allRows = self.form.allRows
let startTime = CFAbsoluteTimeGetCurrent()
var showSpinner = false
for (index, item) in rowItems.enumerated() {
.
.
.
<TableView processing work on 100's of rows>
.
.
.
// Evaluate our running time for this process loop, and display spinner if we're past a threshold of seconds.
let timeElapsed = CFAbsoluteTimeGetCurrent() - startTime
if timeElapsed > 0.5 && showSpinner == false {
showSpinner = true
self.showActivityIndicator(withStatus: "processing") // {NEVER GETS DISPLAYED}
}
} // for (index, item) ...
当然,当我打电话给showActivityIndicator
时,它实际上并没有显示。
我如何中断和暂停UI工作以显示showActivityIndicator
微调器动画,然后让循环继续?
您需要离开主线程,以便允许运行循环循环并发生重绘时刻。在显示微调框之后再进行简单的延迟即可解决问题。但是您将必须重新组织代码以实现此目的。最简单的解决方案是放弃您的0.5秒创意,仅在开始之前显示微调框。