在后台线程中运行的方法调用的主线程上执行带延迟的选择器

时间:2012-06-20 16:05:23

标签: objective-c multithreading nstimer background-process

我有一个方法,我在后台运行,通过调用

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

'getTweets'调用包装器类中的方法,该方法获取推文并在准备好时发布通知。我有一个观察者在发生这种情况时触发'showTweets'。

当调用showTweets时,我想以5秒的延迟调用'hideTweets'。我通过致电:

来做到这一点
self.hideTweetTimer = [NSTimer scheduledTimerWithTimeInterval:5 target:self  selector:@selector(hideTweet) userInfo:nil repeats:NO];    

然而它似乎没有发射。我还有一个调用showTweets方法的按钮,但是当它被按下时,它似乎陷入了isHighlighted状态。

由于初始调用是在后台线程中,我做错了什么?

我试过

[[NSRunLoop currentRunLoop] addTimer:self.hideTweetTimer forMode:NSDefaultRunLoopMode];
[[NSRunLoop currentRunLoop] run];

这似乎可以隐藏推文,但这似乎会导致性能问题。例如,当我在不同的屏幕上加载UIScrollView时,滚动非常粘。

基本上,我所有的问题似乎都来自于在后台线程上执行某些操作,但我不确定是什么......任何帮助都非常感激。谢谢。

1 个答案:

答案 0 :(得分:7)

您是否正在修改这些线程中的UI元素?应该处理UI的唯一线程是主线程。其他线程应该将它们的需求传达给主线程,这将实际为它们做。

您可以使用以下命令将某些内容回调给主线程:

[self performSelectorOnMainThread:@selector(method) withObject:nil waitUntilDone:YES];