【问题标题】:while loop that checks it's condition every second in swiftwhile 循环在 swift 中每秒检查一次它的状态
【发布时间】:2015-09-22 12:30:10
【问题描述】:

如何创建一个每秒检查一次条件的 while 循环?

可能是这样的:

while (isConditionSatisfied){
// wait for 1 second and than check again
}

编辑:系统随机调用此函数bannerViewDidLoadAd。如果它在不适当的时间调用它(条件不满足 - 我的应用程序正在执行一些其他动画),我想推迟它的实现(只是一个 UIView 动画)直到条件满足(我的应用程序已经完成动画,现在实现应该被执行)。我在想我可以每秒检查一次while循环中的条件,但正如你们所说..这是个坏主意。

【问题讨论】:

  • NSTimer 将是一个开始寻找 weheartswift.com/nstimer-in-swift 的好地方
  • 您要检查什么条件?一般来说,这是一个坏主意,因为即使没有任何变化,它也会让您的应用程序保持检查。最好听一个事件通知您某些事情发生了变化,而不是每秒轮询一次更改,因为您的用户的电池将持续更长时间。
  • 答案是使用NSTimer,但正如大家所说的不要这样做......永远不要这样做
  • 我更详细地解释了我的问题。
  • 您可以在那里加载广告并忽略,直到满足您的条件。但是一个布尔值,您可以根据是否应该展示广告来将其设为 false 或 true

标签: ios swift while-loop


【解决方案1】:

像这样使用 while 循环实际上会创建一个无限循环。您应该使用 Timer()。

timer = Timer.scheduledTimer(timeInterval: 1.0, target: self, selector: #selector(self.loop), userInfo: nil, repeats: true)

然后

@objc
func loop() {
    if yourCondition {
        // your code here
        timer.invalidate()
    }
}

确保在声明计时器时使用其他变量声明,以便在满足您的条件后使其无效:

var timer: Timer!

【讨论】:

  • 这是正确的方法,怎么做。请注意,不能保证检查在主线程上运行。
  • 一旦条件满足,别忘了加上这个:timer.invalidate()!
  • 不要使用 repeat 作为函数名,因为它是 Swift 4.2 中的关键字
【解决方案2】:

iOS 10

Timer.scheduledTimer(withTimeInterval: 1, repeats: true) { (timer) in   
    if someCondition {
        timer.invalidate()
    }
}

*withTimeInterval - 秒数

【讨论】:

    【解决方案3】:

    你可以像这样使用 NSTimer

    [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(yourMethodName) userInfo:nil repeats:YES];
    

    【讨论】:

      【解决方案4】:

      我只是组合了一个 Swift NSObject 扩展,它可以让你做到这一点。它使用延迟功能让您wait 直到满足某些条件或您取消它。

      https://gist.github.com/d3signerd/795a9dced39cbee056010d5629d9ca06

      // 等待示例

      waitWhile( { [weak self] () -> condition_parameters in
      
         if let weakSelf = self {
            return ( conditionMet: `criteria to meet`, cancel: false )
         }
         else {
            return ( conditionMet: false, cancel: true )
         }
      
       }, completion: { [weak self] in
      
          // Wait completion code goes here...
      
       })
      

      // 延迟示例

      private var cancelableDelayClosure:dispatch_cancelable_closure? = nil
      
      cancelableDelayClosure = delay( 1.0, closure: { () -> () in
      
          // Delay completion code here...
      })
      
      cancelDelay( &cancelableDelayClosure )
      

      【讨论】:

        【解决方案5】:

        为 swift 更新了代码,

        let timer = Timer.scheduledTimer(
                        timeInterval: 1.0, target: self, selector: #selector(Your_current_vc.yourTask),
                        userInfo: nil, repeats: true)
        
        
        func yourTask() {
        
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2018-03-15
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-01-23
          相关资源
          最近更新 更多