2011-04-09 68 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