Bri*_*Leg 3 asynchronous for-loop swift dispatch-queue
我的应用程序中有一个循环,可能需要几秒钟的时间来处理。
我希望当循环在后台运行时屏幕立即关闭。
这可能吗?
我尝试过仅添加循环:
DispatchQueue.main.async {
for _ in 1...self.numberOfTransactionsToAdd {
let newTransaction = Transaction()
var timeAdded = 1.months
newTransaction.transactionAmount = self.amountTextField.text!.toDouble()
newTransaction.transactionDescription = self.descriptionTextField.text
newTransaction.transactionDate = self.datePicked
newTransaction.transactionCategory = self.categoryPicked
newTransaction.repeatInterval = self.repeatInterval
newTransaction.transactionSubCategory = self.subcategoryPicked
newTransaction.subCategoryName = self.subcategoryPicked!.subCategoryName
try! self.realm.write {
self.realm.add(newTransaction)
}
self.datePicked = self.datePicked + timeAdded
}
}
}
Run Code Online (Sandbox Code Playgroud)
我尝试添加整个功能:
@IBAction func doneButtonPressed(_ sender: UIButton) {
self.dismiss(animated: true, completion: nil)
DispatchQueue.main.async {
self.saveTransaction()
}
}
Run Code Online (Sandbox Code Playgroud)
但在视图消失之前屏幕仍然挂起。
这是我第一次使用DispatchQueue。我读过苹果公司的相关文档,但内容非常模糊。
这是解决这个问题的正确方法吗?
有人可以帮助指导新手采取正确的方法吗?
问题是非 ui 工作(后台工作)对主队列本身的异步调用。DispatchQueue.main.async用。。。来代替DispatchQueue.global().async。原因是所有非 ui 任务都应该在主队列之外异步运行。
完成上述修复后,您仍然会遇到另一个问题,即从非主队列访问 UI 元素(因为现在我们的代码将在全局队列上运行)。原因是您将从全局队列中获取 UI 元素数据(如 amountTextField 的文本等)。将 UI 的数据存储在局部变量中,并在循环代码中使用局部变量,而不是调用 amountTextField 和其他文本字段。
var amountData: Double
var description: String
@IBAction func doneButtonPressed(_ sender: UIButton) {
amountData = amountTextField.text!.toDouble()
descriptionTextField = descriptionTextField.text
DispatchQueue.global().async {
self.saveTransaction()
}
self.dismiss(animated: true, completion: nil)
}
func saveTransaction() {
for _ in 1...self.numberOfTransactionsToAdd {
.
.
newTransaction.transactionAmount = self.amountData
newTransaction.transactionDescription = self.descriptionTextField
.
.
.
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
6095 次 |
| 最近记录: |