Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 在块/闭合完成后检查当前视图状态_Ios_Swift - Fatal编程技术网

Ios 在块/闭合完成后检查当前视图状态

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

在异步执行的块/闭包中,我希望在执行该块中的任何内容之前检查当前状态

出现这种情况的一个常见示例是在NSURLsession请求之后切换到下一个视图控制器

下面是一个例子:

@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,这样他们可以在每次显示该页面时按一次。

当开始一些需要一些时间才能完成的任务时,我会做两件事

  • 显示某种活动指示器,以便用户知道正在发生的事情
  • 禁用按钮,以便进一步指示已收到请求,并防止用户多次点击 重要的是,你不仅要考虑应用程序的正确操作,而且要提供良好的用户体验。p>