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

时间:2016-04-12 21:20:11

标签: ios swift

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

在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。

***更一般地说,如何检查闭包内的当前状态,因为闭包是异步执行的?

2 个答案:

答案 0 :(得分:0)

由于关闭不在主线程上执行,如果你在这里检查状态(如你所说),状态将是准确的。您可以使用GCD转到主线程并检查其中的状态。有几种方法可以防止此代码多次运行。如果执行计算需要一些时间,您可以使用活动指示器让用户知道此时应用程序正忙。如果您希望用户仍然可以选择按下按钮,则可以添加如下标记:

var buttonWasTapped:Bool = false //class property
@IBAction func tappedButton(sender: UIButton) {
   if !self.buttonWasTapped{
        self.buttonWasTapped = true
    }
}

然后在viewDidAppear上将其更改回false,这样每次显示该页面时都可以按一次。

答案 1 :(得分:0)

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

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