在一个异步执行的块/闭包中,我希望在我执行该块内的任何内容之前检查当前状态。
在NSURLsession请求之后,它出现的一个常见示例是在下一个View Controller中。
以下是一个例子:
@IBAction func tappedButton(sender: UIButton) {
//This closure named fetchHistorical goes to the internet and fetches an array
//The response is then sent to the next view controller along with a segue
Order.fetchHistorical(orderID, completionHandler: { (resultEnum) -> () in
switch resultEnum {
case .Success(let result):
let orderItemsArray = result.orderItems!.allObjects
self.performSegueWithIdentifier("showExchanges", sender: orderItemsArray)
default:
let _ = errorModal(title: "Error", message: "Failed!")
}
})
}
假设用户已经不耐烦并点击此按钮3次。
这意味着这个函数将被调用三次,每次它都会尝试转移到下一个视图控制器(iOS很好地阻止了这个问题,“警告:尝试在视图中显示不在窗口层次结构中!” )
我想知道你们怎么解决这个问题?是封闭内的......,检查你是否还在当前的viewcontroller中...如果你是,那么segueing是有效的。如果没有,你可能已经被segued并且不再执行segue。
***更一般地说,如何检查闭包内的当前状态,因为闭包是异步执行的?
答案 0 :(得分:0)
由于关闭不在主线程上执行,如果你在这里检查状态(如你所说),状态将是准确的。您可以使用GCD转到主线程并检查其中的状态。有几种方法可以防止此代码多次运行。如果执行计算需要一些时间,您可以使用活动指示器让用户知道此时应用程序正忙。如果您希望用户仍然可以选择按下按钮,则可以添加如下标记:
var buttonWasTapped:Bool = false //class property
@IBAction func tappedButton(sender: UIButton) {
if !self.buttonWasTapped{
self.buttonWasTapped = true
}
}
然后在viewDidAppear上将其更改回false,这样每次显示该页面时都可以按一次。
答案 1 :(得分:0)
当开始一些需要一些时间才能完成的任务时,我会做两件事;
重要的是,不仅要考虑应用程序的正确操作,还要考虑提供良好的用户体验。