首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么NSTimer在另一个线程运行时被阻塞?

为什么NSTimer在另一个线程运行时被阻塞?
EN

Stack Overflow用户
提问于 2011-03-11 14:36:57
回答 2查看 1.4K关注 0票数 3

我试图在iPhone的后台运行一个宽松的任务。我从performSelectorInBackground开始。我还在主线程上创建了一个NSTimer,以检查事情是否正常。我期望计时器在另一个线程执行任务时运行:

代码语言:javascript
复制
- (void)viewDidLoad
{
    [super viewDidLoad];

    [NSTimer scheduledTimerWithTimeInterval:0.1 target:self
                   selector:@selector(onTimerEvent:)
                   userInfo:nil repeats:YES];   

   [self performSelectorInBackground:@selector(lengthyMethod) withObject:nil];

    NSLog(@"Here we go!");
}

- (void)onTimerEvent:(NSTimer *)timer
{
    NSLog(@"timer!");
}

lenghtyMethod执行了很多功能,包括使用lenghtyMethod下载网址等。

NSLog的输出如下所示:

代码语言:javascript
复制
2011-03-11 15:17:07.470 MyApp[6613:207] Here we go!    
2011-03-11 15:17:07.570 MyApp[6613:207] timer!
2011-03-11 15:17:07.670 MyApp[6613:207] timer!

// ... several seconds of output from lenghtyMethod omitted ...

2011-03-11 15:17:11.075 MyApp[6613:207] timer!
2011-03-11 15:17:11.170 MyApp[6613:207] timer!
// ... etc ... timer runs as expected when the call is completed ...

问题是后台线程似乎阻塞了计时器。我对此的理解是,performSelectorInBackground应该在一个与主循环分离的新线程中运行。

我不明白这个。当线程运行时,我没有从计时器获得输出。一旦调用完成,计时器将再次开始记录。

为了记录在案,线程主要是执行I/O (加载URL),所以操作系统应该有足够的时间来切换线程。这种情况在模拟器和实际设备上都会发生。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-03-11 22:49:16

根据ASIHTTPRequest

对于更复杂的情况,或者您希望在后台解析响应的情况,

为每种类型的请求创建一个最小的ASIHTTPRequest子类,并覆盖requestFinished:和failWithProblem:。

否则,如果使用默认回调,它们将在主线程上运行。

票数 6
EN

Stack Overflow用户

发布于 2011-03-11 14:47:48

NSTimer运行在同一个线程上。

它调用主线程上的事件方法。

您的lengthyMethod方法可能使用主要步骤来执行一些操作。

在这个主线程块之前有两个滴答。

检查一下!

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

https://stackoverflow.com/questions/5274236

复制
相关文章

相似问题

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