Swift3.0 GCD定时器的使用,实现倒计时,UIDatePicker的使用, 仿写一个活动倒计时的DEMO

直接看主要代码

//截止日期
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下载地址

时间: 2024-10-20 18:11:53

Swift3.0 GCD定时器的使用,实现倒计时,UIDatePicker的使用, 仿写一个活动倒计时的DEMO的相关文章

swift3.0变化总结

Swift 3.0 做出的改变很大,在这篇文章中,我将尽我所能,利用代码样例给大家解释Swift 3.0最重要(要命)的改变,希望大家能够做好升级Swift 3.0 的准备.Swift 3.0的改变不仅仅是我下面的这个列表,但是列表中的每一项都是对你的一个巨大的打击. 虽然Swift 3.0 仍处于开发阶段.Swift 3.0 会有很多很多的变化,其中一些可能会在细微之处.然而,我们希望这些变化是一次性的.为了使Swift可以在未来几年更好的发展,在以后的版本更新中改变应该的显著变小.一些Swi

Swift3.0变化分享

Swift 3.0 做出的改变很大,在这篇文章中,我将尽我所能,利用代码样例给大家解释Swift 3.0最重要(要命)的改变,希望大家能够做好升级Swift 3.0 的准备.Swift 3.0的改变不仅仅是我下面的这个列表,但是列表中的每一项都是对你的一个巨大的打击. 虽然Swift 3.0 仍处于开发阶段.Swift 3.0 会有很多很多的变化,其中一些可能会在细微之处.然而,我们希望这些变化是一次性的.为了使Swift可以在未来几年更好的发展,在以后的版本更新中改变应该的显著变小.一些Swi

IOS GCD定时器

提到定时器,NStimer肯定是我们最为熟悉的. 但是NStimer有着很大的缺点,并不准确. 通俗点说,就是它该做他的事了,但是由于其他事件的影响,Nstimer会放弃他应该做的. 而GCD定时器,是不会发生这种事情的. GCD严格按照规定好的规格去做事. 前面介绍RunLoop 的时候已经介绍了NSTimer. 这里就不在介绍了. 在这里着重介绍一下GCD定时器. 首先,我们知道NStimer是在RunLoop的基础上执行的,然而RunLoop是在GCD基础上实现的,所以说GCD可算是更加高

Swift2.3 --&gt; Swift3.0 的变化

Swift3.0语法变化 首先和大家分享一下学习新语法的技巧: 用Xcode8打开自己的Swift2.3的项目,选择Edit->Convert->To Current Swift Syntax- 让Xcode帮我们把Swift2.3的代码转换为Swift3.0. 手动调出Xcode自动转换Swift2.3 到 Swift3.0 弹出语言版本选择界面,选择Covert to Swift3,Next:  进入选择模块界面: 选择模块界面 建议只选择自己创建的模块,第三方框架的模块最好不要使用Xco

GCD定时器

GCD定时器 by 伍雪颖 + (GCDTimer *)repeatingTimer:(NSTimeInterval)seconds block:(void (^)(void))block { NSParameterAssert(seconds); NSParameterAssert(block); GCDTimer *timer = [[self alloc] init]; timer.block = block; timer.source = dispatch_source_create(D

GCD dispatch_source基本使用,创建GCD定时器与NSTimer的区别

可以使用GCD创建定时器 创建定时器: dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); dispatch_source_t timer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, queue); self.timer = timer; // 定时任务调度设置,4秒后启动,每个5秒运行 dispat

runloop 和 CFRunLoop - 定时器 - NSTimer 和 GCD定时器

1. 2. 1 #import "ViewController.h" 2 3 @interface ViewController () 4 @property (nonatomic, strong) dispatch_source_t timer; 5 @end 6 7 @implementation ViewController 8 9 -(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *

(细节控)swift3.0与融云IMKIT开发问题(一部分) override func onSelectedTableRow Method does not override any method from its superclass

原官网文档方案如下,在swift3.0的情况下出现 override func onSelectedTableRow  Method does not override any method from its superclass 这是因为swift3.0 有很多变更,需要更换下onSelectedTableRow参数. //重写RCConversationListViewController的onSelectedTableRow事件 override func onSelectedTableR

使用 swift3.0高仿新浪微博

项目地址:https://github.com/SummerHH/swift3.0WeBo 使用 swift3.0 高仿微博,目前以实现的功能有,添加访客视图,用户信息授权,首页数据展示(支持正文中连接匹配,@匹配)支持照片浏览,大图浏览,保存图片到相册本地, 实现发布微博,发微博添加照片,发送Emoticon表情等功能, 先看下项目整体框架 项目使用 MVC 框架,但是在写的过程中也用到了 MVVM设计模式