2011-04-09 67 views
1

我正在尝试设置一个线程,该线程保持空闲状态,直到新数据可用。在Objective-C中最好的方法是什么?直到现在我试图做一个简单的运行循环iOS中的空闲线程方法

while(YES) { 
    if(isDataAvailable) { 
     //process data 
    } 
} 

然而,这对性能的巨大的影响,我的FPS下降,从40到20,接口变得不可用(即使实际的数据处理在第二个发生一次对于CPU来说并不是很激烈,我试图在最后添加[NSThread sleepForTimeInterval:0.01],但这样我就丢失了数据包('流程数据'指的是一些与流相关的操作,排队和排队数据包),但是FPS返回到正常

我很公平新的Objective-C,我想也许有更好的方法来做到这一点?我也看过NSRunLoop,但没有设法使它作为一个运行循环:),只附加一个定时器,它不会超过我的[NSThread sleepForTimeInterval:0.01]的事情。

任何帮助它的高度赞赏:d

+1

如何使用调度源? (查看关于GCD/Dispatch Sources的文档) – 2011-04-09 20:37:12

+0

稍后会看一下,这是观察者模式的实现吗?听起来像,无论如何,会看看,谢谢! – 2011-04-09 20:41:18

回答

1

如果你需要保持seconary线程活着,你一定要使用一个真正的runloop: http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/Multithreading/RunLoopManagement/RunLoopManagement.html#//apple_ref/doc/uid/10000057i-CH16-SW1

基本上,只要创建并启动你的线程,设置建立一个自动释放池,然后运行你的runloop一段时间。当时间到期时,您检查是否应该退出线程,或再次进入runloop。

正如Marcelo指出的那样,现在有更多的实现并发的方法(GCD和异步调度就是一些例子),所以也可以研究其他形式的并发。

+0

我想,我会再次尝试一下运行循环,CGD看起来很复杂,不幸的是我现在没有时间研究它,但是它会在下一个项目中完成。谢谢! – 2011-04-09 21:26:45

+0

这对我有很大的帮助,现在它工作得很好,我不再失去FPS,如果有其他人有这个问题并登陆这个页面,这绝对是一种方式。 – 2011-04-10 01:10:16