首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >工作线程iOS

工作线程iOS
EN

Stack Overflow用户
提问于 2012-01-06 14:23:09
回答 4查看 7.7K关注 0票数 3

我想在iPhone上创建一个后台线程,每10毫秒执行一次代码。但在我迷上了苹果公司( apple )的并发编程指南和苹果的线程编程指南之前,我想问问这里的人是否能帮我解决问题。我想做的是:

  • 创建后台工作线程
  • ,每10毫秒触发一次方法的执行。(可能通过在线程中使用NSTimer?)
  • 尽可能地减少主应用程序线程的负载(

)。

根据我的理解,对NSThread进行子类化并在该子类中编写我自己的主要方法应该可以做到这一点。这样,我就不会在更新间隔中使用NSTimer,而是类似于:

代码语言:javascript
复制
[NSThread sleepForTimeInterval: 0.01];

此外,主线程和辅助线程之间的排队机制没有任何意义,因为工作线程应该一次又一次地执行相同的操作,直到停止为止。

问题是:如何将线程配置为使用计时器?我不知道如何将NSTimer附加到工作线程运行循环中?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2012-01-06 14:28:06

使用您概述的方法可以做到这一点,但是您看过使用Grand Central Dispatch吗?它可以让这其中的一些变得更容易:

代码语言:javascript
复制
dispatch_queue_t backgroundQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_async(backgroundQueue, ^{
    while ([self shouldKeepProcessingInBackground]) {
        [self doBackgroundWork];
        usleep(1e4);
    }
})

您还可以使用计时器分派源定期进行工作:

代码语言:javascript
复制
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);
票数 11
EN

Stack Overflow用户

发布于 2012-01-06 14:35:01

NSRunLoop是缺少的链接。

您必须设置线程的run循环才能重复,或者您可以从线程的条目中控制它。线程承载计时器(如果运行循环还活着,则计时器将与run循环一起死掉)。

NSRunLoop是一个很小的类-检查它和相关的样本。

票数 2
EN

Stack Overflow用户

发布于 2012-01-06 14:34:19

您可以很容易地使用GCD (大中央调度)来实现这一点。首先,创建一个将在后台调用的选择器。从这里开始打电话给你想要的方法。

代码语言:javascript
复制
- (void)backgroundSelector
{
    // do whatever you want to do
    [self performSelector:@selector(backgroundSelector) withObject:nil afterDelay:0.01];
}

在那之后,第一次像这样启动这个方法

代码语言:javascript
复制
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_LOW, 0), ^{
    [self backgroundSelector];
});

如果这对你有用的话请告诉我。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8759264

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档