NSTimer问题(关闭,@ objc等)

时间:2015-06-18 01:31:19

标签: ios swift closures nstimer

我对swift很新,我对swift甚至只是基本OOP有一些疑问(如果可以的话,请具体说明你的答案,非常感谢!)

所以我正在创建一个具有计时器组件的应用程序,并且以下代码片段来自该计时器类(和视图控制器):

  1. 我有停止/启动功能和deinit:
  2. var timer = NSTimer()
    ...
    func start(){
        self.timer = NSTimer.scheduledTimerWithTimeInterval(1, target: self, selector: "tick", userInfo: nil, repeats: true)
    }
    func stop(){
        timer.invalidate()
    }
    ....
    deinit(){
        self.timer.invalidate()
    }
    

    所以我的第一个问题是,为什么我需要在deinit中调用self.timer并开始但不是停止?另外deinit何时被调用,它的作用与stop函数有什么不同(在我看来它们都使NSTimer无效)?

    1. 还有一个初始化程序:
    2. init (duration: Int, handler: (Int) -> ()){
          self.duration = duration
          self.handler = handler
      }
      

      并在视图控制器中调用初始化程序:

      private func timerSetUP(hr: Bool, duration: Int){
          timer = Timer(duration: duration){
              (elapsedTime: Int) -> () in
              let timeRemaining = duration - elapsedTime
              println("what is the eT: \(elapsedTime)")
              let timeReStr = self.getHrMinSecLabels(hr, timeremaining: timeRemaining)
          ....}
      

      我的问题是关闭,elapsedTime是Timer类中的一个属性,是否只是传递给视图控制器中的闭包?为什么没有Timer类的引用(如timer.elapsedTime)?我真的不需要这个关闭吗?我可以使用另一个执行相同操作的函数(或者使用此闭包更容易获得elapsedTime)?

      1. 我的Timer类中还有一个Tick函数:
      2. @objc func tick(){
            self.elapsedTime++
            self.handler(elapsedTime)
            if self.elapsedTime == self.duration{
                self.stop()
            }
        }
        

        这是self.timer = NSTimer.scheduledTimerWithTimeInterval()的选择器,是一个选择器,只是每次定时器触发时调用的函数?我只需要给NSTimer.scheduledTimerWithTimeInterval()选择器函数的字符串名称吗?还有为什么有@objc,这对我来说看起来像一个快速的功能?

1 个答案:

答案 0 :(得分:1)

您的问题已加载。让我尝试一次解决一个问题:

  

为什么我需要在self.timerdeinit中呼叫start,而不是stop

它的个人编码风格。假设您没有覆盖实例变量的局部变量,self.timertimer相同。

  

同样,deinit何时被调用?它与stop函数的作用有何不同?

运行时释放对象时会调用

deinit。如果您的计时器当时仍在运行,则需要先将其停止。 stop只是停止计时器,但将对象保留在内存中。

  

我的问题是关闭,elapsedTimeTimer类中的属性...

你需要了解一下关闭。 elapsedTime是闭包/匿名函数的参数。当计时器触发时,Timer对象将其elapsedTime属性传递给该匿名函数。如果你像这样重命名它也可以这样做:

timer = Timer(duration: duration){
    (t : Int) -> () in
    let timeRemaining = duration - t
    println("what is the eT: \(t)")
    let timeReStr = self.getHrMinSecLabels(hr, timeremaining: timeRemaining)
....}
  

是一个选择器,只是每次定时器触发时调用的函数?

是。但是你需要指定调用函数的对象(参见下一个问题中的target参数)。

  

我是否只需要给NSTimer.scheduledTimerWithTimeInterval()选择器函数的字符串名称?

是的,就像这样:

// Fire the tellTime() function of the current object every second (1000ms)
self.timer = NSTimer.scheduledTimerWithTimeInterval(
                        timeInterval: 1000,
                        target: self,
                        selector: "tellTime",
                        userInfo: nil,
                        repeats: true)
  

为什么还有@objc,这对我来说只是一个快速的功能?

这是为了让Objective-C代码能够识别你的Swift函数。如果您只在Swift中编程,则可以跳过它。