我该如何在另一个线程的runloop中安排某些内容?
问题描述:
我正在编写一个将通过tcp连接发送/接收数据的应用程序,并且我想要安排读/写在不同线程的运行循环中发生。意思线程1创建连接并在线程2的运行循环中安排它。我无法找到任何访问不同线程的运行循环的方式,因此我编写了一段代码,辅助线程将运行它将存储它的运行循环在全球可访问的位置。我想知道这是否是正确的做法,或者是否有其他更好的方法来做同样的事情,并且如果我这样做会导致像访问运行循环这样的问题不是线程安全的并且导致如果我尝试在多个线程的同一线程的运行循环上安排多个事件,则会出现问题。我该如何在另一个线程的runloop中安排某些内容?
像下面这样。
[NSRunLoop currentRunLoop] - >这个我可以从他们runloop我要访问的线程做
NSRunLoop * secondthreadrunloop = [secondthread getRunLoop] - >但有没有这样的事情?
答
我最近遇到了同样的问题,看起来答案是 - 不,你不能在运行在不同线程上的NSRunLoop上安排任何事情。 Apple说NSRunLoop不是线程安全的,这意味着将NSTimer实例附加到它会导致未定义的行为(我已经检查过它,在我的情况下它会随机生成崩溃)。
虽然可以做的是从后台线程本身安排一个重复的计时器,并使其从某个原子属性中选取想要它执行的工作。
如果你需要建立一个使用TCP的应用程序,我会大力推荐使用这个库https://github.com/robbiehanson/CocoaAsyncSocket,而不是自己写所有东西。将节省大量的工作和神经...... – nburk 2014-10-27 10:36:45
我不允许使用苹果提供的其他东西。不过谢谢。 – Shehzan 2014-10-27 10:43:09
看看“Grand Central Dispatch”(GCD)和函数dispatch_sync,dispatch_async和dispatch_once – TheDarkKnight 2014-10-27 13:14:09