【问题标题】:Swift's way to handle this situation instead of using boolsSwift 处理这种情况的方法而不是使用书籍
【发布时间】:2020-02-06 19:05:50
【问题描述】:

我有一个函数,如果当前不执行,我只想执行它。 我使用了一个 bool 变量来检查当前的执行情况。

Swift 是否提供了任何其他解决方案来处理此问题而不是使用 Bool?

 guard
        !isExecuting,
        let currentNavVC = tabBarController.selectedViewController as? UINavigationController
        else { return }
    
    isExecuting = true
    
    let first = currentNavVC.viewControllers.first,
    let last = currentNavVC.viewControllers.last
    var controllers = [first]
    if first != last {
        controllers = [first, last]
    }
    
    DispatchQueue.main.async {
        currentNavVC.viewControllers = controllers
        isExecuting = false
    }

布尔变量:isExecuting

注意:

尝试使用 Semaphores(DispatchSemaphore) 但它们没有帮助。
我也在 didReceiveMemoryWarning() 中调用上述函数

任何帮助都将不胜感激并提前致谢!!

【问题讨论】:

  • 这段代码应该没有问题,除非你打算在 DispatchQueue 闭包之后使用 isExecuting 并期望它是 false
  • 代码执行正常,但我想知道是否可以不使用bool。 @vadian
  • 为什么?这是一个相当合理的方式。
  • 您可以检查视图控制器的计数。类似currentNavVC.viewControllers.count != 2
  • currentNavVC.viewControllers.count != 2 将无济于事,因为该函数被多次调用。我已经从 didReceiveMemoryWarning() @Desdenova 调用了该函数

标签: ios swift cocoa-touch boolean


【解决方案1】:

我相信在这种情况下你也可以使用OperationOperationQueue

Operation 支持取消以及检查它是否正在执行。

参考:

操作队列:https://developer.apple.com/documentation/foundation/operationqueue

操作:https://developer.apple.com/documentation/foundation/operation

【讨论】:

  • 谢谢!操作队列将起作用,但我想要的是所有其他对该方法的调用都会被拒绝,如果它已经在执行的话。当使用操作队列时,方法调用被保存并在当前操作完成时执行。我不想为以后执行保存额外的方法调用。
  • 我认为如果您将Operation 保留为可选变量(如var currentOperation: Operation?)会起作用,稍后您可以调用currentOperation?.cancel() 然后为currentOperation 创建另一个Operation 并执行它.
  • 谢谢,它成功了。我正在使用可选的 BlockOperation 并在完成时将其设置为 nil。 OperationQueue 的 maxConcurrentOperationCount 也设置为 1,以仅允许执行单个操作。感谢您的帮助
  • 太棒了!很高兴它有帮助。
【解决方案2】:

我有一个我只想在当前不执行时才执行的函数

您正在寻找一个。但是自己的锁是棘手和危险的。获得锁的简单、安全的方法是使用串行队列。正如我们所说,串行队列是一种锁。所以:

  • 如果你的函数在主队列中被调用,那么如果它当前正在执行,它不能执行,并且没有什么可做的。主队列是串行队列,只能有一个。

  • 如果您的函数在后台队列中调用,请确保您的队列是串行队列。比如你自己创建DispatchQueue,默认是串行的。

【讨论】:

    猜你喜欢
    • 2019-01-09
    • 2017-12-11
    • 1970-01-01
    • 2017-12-13
    • 1970-01-01
    • 2021-07-08
    • 1970-01-01
    • 2013-01-05
    • 1970-01-01
    相关资源
    最近更新 更多