美文网首页iOS开发技术分享
Swift之dispatch_source实现多线程定时关闭功能

Swift之dispatch_source实现多线程定时关闭功能

作者: devchena | 来源:发表于2015-10-22 08:30 被阅读2771次

由于在项目中需要用到定时关闭音频功能, 本来打算用NSTimer的,可是写起来并不是那么精简好用,所以又在网上找到相关的实例,结合自己项目需要,就写出了如下代码,还请大家指教,废话不多说:

效果图效果图
import UIKit

class TimeCountdown: NSObject {
    
    var content: String = "未开启"                    //倒计时要展示的内容
    var status: Bool = false                    //定时器状态
    private var timer: dispatch_source_t?
    private var currentQueue: dispatch_queue_t?
    
    //这里使用了单利
    class func shareInstance() -> TimeCountdown {
        struct singleton {
            static var predicate: dispatch_once_t = 0
            static var instance: TimeCountdown? = nil
        }
        //只调用一次
        dispatch_once(&singleton.predicate, { () -> Void in
            singleton.instance = TimeCountdown()
        })
        return singleton.instance!
    }

    //调用该对象方法启动倒计时,minutes为传入的分钟数
    func startTimeOut(minutes: Int) {
        var timeOut =  minutes * 60 //秒数,用于计算
        if timer != nil {
            dispatch_source_cancel(self.timer!)
            timer = nil;
        }
        
        //不开启
        if (minutes == 0) {
            self.content = "未开启"
            self.status = false
            dispatch_async(dispatch_get_main_queue(), { () -> Void in
                NSNotificationCenter.defaultCenter().postNotificationName("startTimeOut", object: nil, userInfo: nil)
            })
            return
        }

        if currentQueue == nil {
            currentQueue = dispatch_queue_create("com.gcd.timeout", nil)
        }
        self.status = true
        timer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, currentQueue)
        dispatch_source_set_timer(timer!, dispatch_walltime(nil, 0), 1*NSEC_PER_SEC, 0)
        dispatch_source_set_event_handler(timer!, { () -> Void in
            if (timeOut <= 0) {
                dispatch_source_cancel(self.timer!)
                self.content = "未开启"
                self.status = false
                dispatch_async(dispatch_get_main_queue(), { () -> Void in
                    //暂停播放器
                    AudioPlayerViewController.pausePlayer()
                })
            } else {
                var minutes = timeOut / 60
                var seconds = timeOut % 60
                self.content = "\(minutes)分\(seconds)秒后, 将暂停播放广播"
                --timeOut
            }
            dispatch_async(dispatch_get_main_queue(), { () -> Void in
                 //每秒发送一次通知, 用于更新要显示的倒计时时间(在制定控制器监听该通知)
                NSNotificationCenter.defaultCenter().postNotificationName("startTimeOut", object: nil, userInfo: nil)
            })
        })
        //启动 dispatch source
        dispatch_resume(timer!)
    }

    
   
}

相关文章

  • Swift之dispatch_source实现多线程定时关闭功能

    由于在项目中需要用到定时关闭音频功能, 本来打算用NSTimer的,可是写起来并不是那么精简好用,所以又在网上找到...

  • 使用PHP代码实现计划任务

    参考PHP实现执行定时任务的几种思路详解 PHP本身是没有定时功能的,这主要是因为PHP无法实现多线程。所谓多线程...

  • PHP实现执行定时任务的几种思路详解

    PHP本身是没有定时功能的,PHP也不能多线程。PHP的定时任务功能必须通过和其他工具结合才能实现,例如WordP...

  • windows 定时关闭功能

    我们偶尔会碰到临时有事需要长时间离开电脑的情况,但是电脑可能还有工作还在进行,比如下载、安装、编译等等。如果我们不...

  • Java多线程1

    创建多线程的3种方式 1、继承Thread类实现多线程 2、实现Runnable接口方式实现多线程 定时器 线程的...

  • FTP莫名删文件---SpringMVC配置问题

    1.问题描述 实现功能:使用@Schedule注解定时多线程清理ftp文件产生问题:未知原因莫名清空ftp连接的主...

  • SpringBoot中@Scheduled实现多线程并发定时任务

    SpringBoot中@Scheduled实现多线程并发定时任务 1.背景 Spring Boot实现定时任务非常...

  • gcd中的定时器

    runloop中的定时器会受模式的影响。gcd中的定时器不会。 在代码中敲出dispatch_source 就打出...

  • swift 实现 LeetCode

    swift实现链表 swift实现队列功能 swift实现栈的功能 判断给定的一组数是否是回文结构。如:1、2、3...

  • iOS中的定时器

    iOS中定时器有三种,分别是NSTimer、CADisplayLink、dispatch_source,下面就分别...

网友评论

    本文标题:Swift之dispatch_source实现多线程定时关闭功能

    本文链接:https://www.haomeiwen.com/subject/zorthttx.html