swift 设置循环定时器

2017-03-27 16:29:42 onlychengzhi 阅读数 4193


在项目里面需要使用到定时器

这里我百度了一下 

用法和OC差不多

测试成功,也没多少变化 下面上代码。


    // 定时器

    private var timer:Timer!



     // 启用计时器,控制每N秒执行一次getNetData方法

        timer = Timer.scheduledTimer(timeInterval: 5,

                                                       target:self,selector:#selector(OrderDetailsViewCtl.getNetData),

                                                       userInfo:nil,repeats:true)

    override func viewWillDisappear(_ animated: Bool) {

        super.viewWillDisappear(animated)

        // 退出的时候清空定时器

        timer.invalidate()


    }


2017-10-23 13:37:47 zxw_xzr 阅读数 14605

Swift 4.0中对 GCD定时器的写法做了很多改进,使之更符合Swift的语言特点,比OC的语法看起来是简明清晰了不少

/// GCD定时器倒计时⏳
///   - timeInterval: 循环间隔时间
///   - repeatCount: 重复次数
///   - handler: 循环事件, 闭包参数: 1. timer, 2. 剩余执行次数
public func DispatchTimer(timeInterval: Double, repeatCount:Int, handler:@escaping (DispatchSourceTimer?, Int)->())
{
    if repeatCount <= 0 {
        return
    }
    let timer = DispatchSource.makeTimerSource(flags: [], queue: DispatchQueue.main)
    var count = repeatCount
    timer.schedule(wallDeadline: .now(), repeating: timeInterval)
    timer.setEventHandler(handler: {
        count -= 1
        DispatchQueue.main.async {
            handler(timer, count)
        }
        if count == 0 {
            timer.cancel()
        }
    }) 
    timer.resume()
}
/// GCD定时器循环操作
///   - timeInterval: 循环间隔时间
///   - handler: 循环事件
public func DispatchTimer(timeInterval: Double, handler:@escaping (DispatchSourceTimer?)->())
{
    let timer = DispatchSource.makeTimerSource(flags: [], queue: DispatchQueue.main)
    timer.schedule(deadline: .now(), repeating: timeInterval)
    timer.setEventHandler {
        DispatchQueue.main.async {
            handler(timer)
        }
    }
    timer.resume()
}
/// GCD延时操作
///   - after: 延迟的时间
///   - handler: 事件
public func DispatchAfter(after: Double, handler:@escaping ()->())
{
    DispatchQueue.main.asyncAfter(deadline: .now() + after) { 
        handler()
    }
}

函数的使用

    override func viewDidLoad() {
        super.viewDidLoad()


        DispatchTimer(timeInterval: 1, repeatCount: 10) { (timer, count) in
                print("剩余执行次数 = \(count)")
            }

        DispatchAfter(after: 5) { 
            print("您好")
        }
    }

打印结果:
剩余执行次数 = 9
剩余执行次数 = 8
剩余执行次数 = 7
剩余执行次数 = 6
剩余执行次数 = 5
您好
剩余执行次数 = 4
剩余执行次数 = 3
剩余执行次数 = 2
剩余执行次数 = 1
剩余执行次数 = 0

2017-02-21 21:19:53 feng2qing 阅读数 4458

关键代码

//截止日期
let endDate = datePicker.date
//开始日期
let startDate = Date()
//时间间隔
let timeInterval:TimeInterval = endDate.timeIntervalSince(startDate)

if timer == nil {
    //剩余时间
    var timeout = timeInterval
    if timeout != 0 {

        //创建全局队列
        let queue = DispatchQueue.global()
        //在全局队列下创建一个时间源
        timer = DispatchSource.makeTimerSource(flags: [], queue: queue)
        //设定循环的间隔是一秒,并且立即开始
        timer?.scheduleRepeating(wallDeadline: DispatchWallTime.now(), interval: .seconds(1))
        //时间源出发事件
        timer?.setEventHandler(handler: {
            //必须是当前日期往后的日期,在datePicker上也做了限制
            if timeout <= 0 {
                self.timer?.cancel()
                self.timer = nil
                DispatchQueue.main.async(execute: {
                    self.day.text = "00"
                    self.hour.text = "00"
                    self.minute.text = "00"
                    self.second.text = "00"
                })
            } else {
                //计算剩余时间
                let days = Int(timeout) / (3600 * 24)
                if days == 0 {
                    self.day.text = ""
                }
                let hours = (Int(timeout) - Int(days) * 24 * 3600) / 3600
                let minutes = (Int(timeout) - Int(days) * 24 * 3600 - Int(hours) * 3600) / 60
                let seconds = Int(timeout) - Int(days) * 24 * 3600 - Int(hours) * 3600 - Int(minutes) * 60
                //主队列中刷新UI
                DispatchQueue.main.async(execute: {
                    if days == 0 {
                        self.day.text = "0"
                    } else {
                        self.day.text = "\(days)"
                    }
                    if hours < 10 {
                        self.hour.text = "0" + "\(hours)"
                    } else {
                        self.hour.text = "\(hours)"
                    }
                    if minutes < 10 {
                        self.minute.text = "0" + "\(minutes)"
                    } else {
                        self.minute.text = "\(minutes)"
                    }
                    if seconds < 10 {
                        self.second.text = "0" + "\(seconds)"
                    } else {
                        self.second.text = "\(seconds)"
                    }
                })
                timeout -= 1
            }
        })
        //启动时间源
        timer?.resume()
    }
}

DEMO效果图

这里写图片描述

DEMO下载地址

2017-08-20 16:56:12 wangzbjy 阅读数 1334

我们有时启用一个定时器来做一些事情,比如计时等。

启用一个计数,60秒,停止

Var timer = Timer()

count =  0

timer = Timer.scheduledTimer(timeInterval:1, target: self, selector:#selector(ViewController.changevalue),userInfo:nil,repeats: true)

//这里的 viewcontroller可以用self代替。 Changevalue是你循环的函数名

Func  changevalue() {

//代码

count += 1

if count  > =60

 

 timer.invalidate()

}

swift定时器的使用

阅读数 2865

swift定时器探究

阅读数 139