Ios 在块/闭合完成后检查当前视图状态
在异步执行的块/闭包中,我希望在执行该块中的任何内容之前检查当前状态 出现这种情况的一个常见示例是在NSURLsession请求之后切换到下一个视图控制器 下面是一个例子:Ios 在块/闭合完成后检查当前视图状态,ios,swift,Ios,Swift,在异步执行的块/闭包中,我希望在执行该块中的任何内容之前检查当前状态 出现这种情况的一个常见示例是在NSURLsession请求之后切换到下一个视图控制器 下面是一个例子: @IBAction func tappedButton(sender: UIButton) { //This closure named fetchHistorical goes to the internet and fetches an array //The response is then sen
@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中。。。如果是,则segue是有效的。如果没有,您可能已经执行了segue,不再执行segue
***更一般地说,由于闭包是异步执行的,您如何检查闭包中的当前状态 由于闭包没有在主线程上执行,因此如果您在此处进行检查(如您所述),状态将是准确的。您可以使用GCD转到主线程并检查那里的状态。有几种方法可以防止此代码多次运行。如果需要一些时间来执行计算,您可以使用活动指示器让用户知道应用程序当前正忙。如果您希望用户仍然可以选择按下按钮,您可以放置如下标签:
var buttonWasTapped:Bool = false //class property
@IBAction func tappedButton(sender: UIButton) {
if !self.buttonWasTapped{
self.buttonWasTapped = true
}
}
然后在ViewDidDisplay上将其改回false,这样他们可以在每次显示该页面时按一次。当开始一些需要一些时间才能完成的任务时,我会做两件事