swift中,之前定期去做事情,用的是NSTimer,定时器,但是NSTimer是必须在主线程中实现
-》占用主线程的资源和时间
-》现在想要去实现不在main主线程的,定期去做事情的功能
swift periodic timer
Using an NSTimer in Swift – Stack Overflow
ios – Swift – Do something every x minutes – Stack Overflow
ios – How can I use NSTimer in Swift? – Stack Overflow
swift periodic timer not in main thread
swift background timer
objective c – How do I create a NSTimer on a background thread? – Stack Overflow
swift – iOS Timer in the background – Stack Overflow
NSRunLoopCommonModes
iOS 中的timer — NSRunLoopCommonModes和Timer .NSThread和Timer.GCD中的Timer – Dev_APP的专栏 – 博客频道 – CSDN.NET
NSRunLoopCommonModes和Timer – 简书
然后是可以创建的:
<code> var wsKeepConnectTimer:dispatch_source_t init(){ //self.wsKeepConnectTimer = NSTimer() //1. get/create a queue let backgroundQueue = dispatch_get_global_queue(QOS_CLASS_BACKGROUND, 0) //<OS_dispatch_queue_root: com.apple.root.background-qos[0x52ceac0] = { xrefcnt = 0x80000000, refcnt = 0x80000000, suspend_cnt = 0x0, locked = 1, target = [0x0], width = 0x7fff, running = 0x1, barrier = 0 }> //2. create source timer self.wsKeepConnectTimer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, backgroundQueue) //<OS_dispatch_source: kevent-source[0x7c95fd70] = { xrefcnt = 0xa, refcnt = 0x3, suspend_cnt = 0x1, locked = 0, target = com.apple.libdispatch-manager[0x52cf040], ident = 0x0, mask = 0x0, pending_data = 0x0, registered = 0, armed = 0, deleted = 0, canceled = 0, needs_mgr = 0, timer = { target = 0x0, deadline = 0x0, last_fire = 0x0, interval = 0x0, flags = 0x2 }, kevent = 0x7c95f3f0, filter = DISPATCH_EVFILT_TIMER }> super.init(nibName: nil, bundle: nil) } func startWsKeepConnectTimer() { // //Note: makesure when call NSTimer.scheduledTimerWithTimeInterval, need in Loop environment // //so here need in main queue // dispatchMain_async({ // self.wsKeepConnectTimer = NSTimer.scheduledTimerWithTimeInterval( // NSTimeInterval(WebsocketKeepConnectIntervalInSec), // target: self, // selector:#selector(MainViewController.websocketKeepConnect), // userInfo: nil, // repeats: true) // NSRunLoop.currentRunLoop().addTimer(self.wsKeepConnectTimer, forMode: NSRunLoopCommonModes) // // gLog.info("start websocket keep connect timer: \(self.wsKeepConnectTimer)") // }) //create timer /* 第1个参数: 需要给哪个定时器设置 第2个参数: 定时器开始的时间/DISPATCH_TIME_NOW立即执行 第3个参数: 定时器开始之后的间隔时间 第4个参数: 定时器间隔执行的精准度, 传入0代表最精准(尽量的让定时器精准), 传入一个大于0的值, 代表多少秒的范围是可以接受的 第四个参数存在的意义: 主要是为了提高程序的性能 注意点: Dispatch的定时器接收的时间是纳秒 */ //3. set start time let startTime:dispatch_time_t = dispatch_time(DISPATCH_TIME_NOW, 0) //226016506822943 //4. set interval let intervalInSec:UInt64 = WebsocketKeepConnectIntervalInSec * NSEC_PER_SEC //20000000000 //5. set leeway let leeway:UInt64 = 0 * NSEC_PER_SEC //0 dispatch_source_set_timer(self.wsKeepConnectTimer, startTime, intervalInSec, leeway) dispatch_source_set_event_handler(self.wsKeepConnectTimer, { self.websocketKeepConnect() }) dispatch_resume(self.wsKeepConnectTimer) } func StopWsKeepConnectTimer() { gLog.info("stop websocket keep connect timer \(self.wsKeepConnectTimer)") //self.wsKeepConnectTimer.invalidate() dispatch_source_cancel(self.wsKeepConnectTimer) } </code>
转载请注明:在路上 » [已解决]swift中创建不在main主线程的定时器