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

Smi*_*key 0 multithreading objective-c background-process nstimer

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

[self performSelectorInBackground:@selector(getTweets) withObject:nil];
Run Code Online (Sandbox Code Playgroud)

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

当调用showTweets时,我想以5秒的延迟调用'hideTweets'.我这样做是通过调用:

self.hideTweetTimer = [NSTimer scheduledTimerWithTimeInterval:5 target:self  selector:@selector(hideTweet) userInfo:nil repeats:NO];    
Run Code Online (Sandbox Code Playgroud)

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

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

我试过了

[[NSRunLoop currentRunLoop] addTimer:self.hideTweetTimer forMode:NSDefaultRunLoopMode];
[[NSRunLoop currentRunLoop] run];
Run Code Online (Sandbox Code Playgroud)

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

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

小智 7

您是否从这些线程修改UI元素?应该处理UI的唯一线程是主线程.其他线程应该将它们的需求传达给主线程,实际上它将为它们执行.

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

[self performSelectorOnMainThread:@selector(method) withObject:nil waitUntilDone:YES];
Run Code Online (Sandbox Code Playgroud)