我想在iPhone上创建一个后台线程,每10毫秒执行一次代码。但在我迷上了苹果公司( apple )的并发编程指南和苹果的线程编程指南之前,我想问问这里的人是否能帮我解决问题。我想做的是:
)。
根据我的理解,对NSThread进行子类化并在该子类中编写我自己的主要方法应该可以做到这一点。这样,我就不会在更新间隔中使用NSTimer,而是类似于:
[NSThread sleepForTimeInterval: 0.01];此外,主线程和辅助线程之间的排队机制没有任何意义,因为工作线程应该一次又一次地执行相同的操作,直到停止为止。
问题是:如何将线程配置为使用计时器?我不知道如何将NSTimer附加到工作线程运行循环中?
发布于 2012-01-06 14:28:06
使用您概述的方法可以做到这一点,但是您看过使用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);发布于 2012-01-06 14:35:01
NSRunLoop是缺少的链接。
您必须设置线程的run循环才能重复,或者您可以从线程的条目中控制它。线程承载计时器(如果运行循环还活着,则计时器将与run循环一起死掉)。
NSRunLoop是一个很小的类-检查它和相关的样本。
发布于 2012-01-06 14:34:19
您可以很容易地使用GCD (大中央调度)来实现这一点。首先,创建一个将在后台调用的选择器。从这里开始打电话给你想要的方法。
- (void)backgroundSelector
{
// do whatever you want to do
[self performSelector:@selector(backgroundSelector) withObject:nil afterDelay:0.01];
}在那之后,第一次像这样启动这个方法
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_LOW, 0), ^{
[self backgroundSelector];
});如果这对你有用的话请告诉我。
https://stackoverflow.com/questions/8759264
复制相似问题