Swift:NSTimer的到期/失效测试似乎失败

Swift:NSTimer的到期/失效测试似乎失败,timer,swift,nstimer,Timer,Swift,Nstimer,使用Swift,我很难测试NSTimer的过期/失效 特别是,为什么像whiletimer1!=nil{}或而timer1?.valid{}在看起来明显无效并直接设置为nil后,不会逃逸空循环 我已经回顾了与NSTimer相关的几个问题,除非Obj-C中有一个版本由于我对ObjC的理解不当而无法识别为同一个问题,否则我不认为(直接)涵盖了这个问题 请注意,我不是要直接“修复”代码,我是在寻求理解 // ViewController.swift // NSTimerTest import

使用Swift,我很难测试NSTimer的过期/失效

特别是,为什么像
whiletimer1!=nil{}
而timer1?.valid{}
在看起来明显无效并直接设置为nil后,不会逃逸空循环

我已经回顾了与NSTimer相关的几个问题,除非Obj-C中有一个版本由于我对ObjC的理解不当而无法识别为同一个问题,否则我不认为(直接)涵盖了这个问题

请注意,我不是要直接“修复”代码,我是在寻求理解

//  ViewController.swift
//  NSTimerTest


import UIKit

class ViewController: UIViewController {

    var z:Int = 0
    var timer1:NSTimer? = nil

    @IBOutlet var lblMessage: UILabel
    @IBOutlet var lbl2: UILabel
    @IBAction func btnPress(sender: AnyObject) {
        doBtnPress()
    }

    override func viewDidLoad() {
        super.viewDidLoad()
        z = 0
        lblMessage.text = "Timer was called \(z) times."
        lbl2.text = "waiting for countdown"

    }


    func doBtnPress(){
        lblMessage.text = "doBtnPress!!"
        timer1 = NSTimer.scheduledTimerWithTimeInterval(1.0, target: self, selector: "doTimedAction", userInfo: nil, repeats: true)

        // All of the below infinitely loop 
        // while timer1?.valid { }  // <=== never escapes, also depreciated in IOS 8.0 ???
        // while timer1 { }       // <==== never escapes
        // while timer1 != nil { } // <==== never escapes 
        // while z >= 0 { }       //  <==== test counter instead, but no use 


        lbl2.text = "timer has been invalidated"
    }

    func doTimedAction(){
        lblMessage.text = "Timer was called \(++z) times."

        if z >= 10 {
            timer1?.invalidate()
            timer1 = nil
            z = -1      
        }

    }     
}
//ViewController.swift
//NSTimerTest
导入UIKit
类ViewController:UIViewController{
变量z:Int=0
变量计时器1:n计时器?=nil
@IBOutlet var LBL消息:UILabel
@IBOutlet变量lbl2:UILabel
@iAction func btnPress(发送方:任意对象){
doBtnPress()
}
重写func viewDidLoad(){
super.viewDidLoad()
z=0
lblMessage.text=“计时器被调用\(z)次。”
lbl2.text=“等待倒计时”
}
func-doBtnPress(){
lblMessage.text=“doBtnPress!!”
timer1=NSTimer.scheduledTimerWithTimeInterval(1.0,目标:self,选择器:“doTimedAction”,userInfo:nil,repeats:true)
//所有下面的无限循环

//而timer1?.valid{}/当您在循环中时,您正在阻止计时器启动,因为计时器和循环都在同一个线程上


查看关于以及在后台线程上创建
NSTimer
的文档。

您能解释一下吗?当while循环不存在(注释掉)时,计时器确实每1秒触发一次,并且z递增。同时,标签会立即更新(显示时不会延迟)在我看来,这似乎表明NSTimer在自己的线程上,调用doTimedAction。好的,现在让我们实现while z>=0{}.我想这会阻止下一行被击中,但同时,计时器1还没有被实现并设置为启动,因此增加z并最终允许我们退出循环,10次迭代l后,当z设置为-1……在这种情况下,阻止计时器意味着什么。循环是块吗正在运行它?好吧,冒着过于简单化的风险,当程序在执行
while
循环时,同一程序中的任何其他程序都不能执行,除非它在不同的线程上(而计时器不是)。请参阅运行循环回答中的新注释。