2014-10-27 20 views
2

我正在編寫一個將通過tcp連接發送/接收數據的應用程序,並且我想要安排讀/寫在不同線程的運行循環中發生。意思線程1創建連接並在線程2的運行循環中安排它。我無法找到任何訪問不同線程的運行循環的方式,因此我編寫了一段代碼,輔助線程將運行它將存儲它的運行循環在全球可訪問的位置。我想知道這是否是正確的做法,或者是否有其他更好的方法來做同樣的事情,並且如果我這樣做會導致像訪問運行循環這樣的問題不是線程安全的並且導致如果我嘗試在多個線程的同一線程的運行循環上安排多個事件,則會出現問題。我該如何在另一個線程的runloop中安排某些內容?

像下面這樣。

[NSRunLoop currentRunLoop] - >這個我可以從他們runloop我要訪問的線程做

NSRunLoop * secondthreadrunloop = [secondthread getRunLoop] - >但有沒有這樣的事情?

+0

如果你需要建立一個使用TCP的應用程序,我會大力推薦使用這個庫https://github.com/robbiehanson/CocoaAsyncSocket,而不是自己寫所有東西。將節省大量的工作和神經...... – nburk 2014-10-27 10:36:45

+0

我不允許使用蘋果提供的其他東西。不過謝謝。 – Shehzan 2014-10-27 10:43:09

+0

看看「Grand Central Dispatch」(GCD)和函數dispatch_sync,dispatch_async和dispatch_once – TheDarkKnight 2014-10-27 13:14:09

回答

0

我最近遇到了同樣的問題,看起來答案是 - 不,你不能在運行在不同線程上的NSRunLoop上安排任何事情。 Apple說NSRunLoop不是線程安全的,這意味着將NSTimer實例附加到它會導致未定義的行爲(我已經檢查過它,在我的情況下它會隨機生成崩潰)。

雖然可以做的是從後臺線程本身安排一個重複的計時器,並使其從某個原子屬性中選取想要它執行的工作。

相關問題