在异步执行的 block /闭包中,我想在执行该 block 中的任何内容之前检查当前状态。
一个常见的例子是在 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次。
这意味着这个函数将被调用三次,每次它都会尝试跳转到下一个 View Controller (iOS 很好地阻止了这个问题,并显示“警告:尝试呈现不在窗口层次结构中的 View !” )
我想知道你们是如何解决这个问题的?是否类似于...在闭包内,检查您是否仍在当前 View Controller 中...如果是,则继续是有效的。如果没有,您可能已经执行了 segue,并且不再执行 segue。
***更一般地说,由于闭包是异步执行的,因此如何检查闭包内的当前状态?
最佳答案
由于闭包不在主线程上执行,因此如果您在此处检查(如您所述),状态将是准确的。您可以使用 GCD 转到主线程并检查那里的状态。有几种方法可以防止此代码多次运行。如果执行计算需要一些时间,您可以使用事件指示器让用户知道应用程序目前正忙。如果您希望用户仍然可以选择按下按钮,您可以添加如下标签:
var buttonWasTapped:Bool = false //class property
@IBAction func tappedButton(sender: UIButton) {
if !self.buttonWasTapped{
self.buttonWasTapped = true
}
}
然后在 viewDidAppear 上将其更改回 false,以便他们可以在每次显示该页面时按一次。
关于ios - block /关闭完成后检查当前 View 状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36584267/