问题描述
我想在 iPhone 上创建一个后台线程,每 10 毫秒执行一次代码.但是在我再次迷失在并发编程指南和线程编程指南中之前,我想问问这里是否有人可以帮助我.我想做什么:
- 创建后台工作线程
- 每 10 毫秒触发一次方法的执行.(可能通过在该线程中使用 NSTimer?)
- 尽可能减少主应用线程的负载
据我了解,子类化 NSThread 并在该子类中编写我自己的 main 方法应该可以解决问题.这样我就不会使用 NSTimer 作为更新间隔,而是使用类似:
[NSThread sleepForTimeInterval: 0.01];
此外,主线程和工作线程之间的排队机制没有任何意义,因为工作线程应该一遍又一遍地执行相同的操作 - 直到停止.
问题是:如何配置线程以使用计时器?我看不到如何将 NSTimer 附加到该工作线程 Run Loop?
推荐答案
使用您概述的方法可以做到这一点,但是您是否考虑过使用 Grand Central Dispatch?它可以使其中一些变得更容易:
dispatch_queue_t backgroundQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); dispatch_async(backgroundQueue, ^{ while ([self shouldKeepProcessingInBackground]) { [self doBackgroundWork]; usleep(1e4); } })
您还可以使用计时器调度源定期执行工作:
dispatch_queue_t backgroundQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); dispatch_source_t timerSource = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, backgroundQueue); dispatch_source_set_timer(timerSource, dispatch_time(DISPATCH_TIME_NOW, 0), 0.01*NSEC_PER_SEC, 0*NSEC_PER_SEC); dispatch_source_set_event_handler(timerSource, ^{ [self doBackgroundWork]; }); dispatch_resume(timerSource);