ios - block /关闭完成后检查当前 View 状态

标签 ios swift

在异步执行的 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/

相关文章:

ios - 使用 AVAudioPlayer 播放多个音频文件

ios - 如何在 Swift 中的两个按钮之间切换背景?

swift - 如何删除嵌入式 PageViewController 上的按钮栏?

ios - 为什么 Swift 中的 Apple 示例不适合我?

ios - 如何根据宽度更改 View 的高度

ios - adjustmentFontForContentSizeCategory 是否适用于自定义字体?

iOS UITableViewCell 自动调整大小错误

ios - 使用开关更改整个应用程序中文本、单元格和 View Controller 的颜色

ios - 如何根据我的应用程序检查地址簿

ios - SwiftUI 持有对导致崩溃的已删除核心数据对象的引用