在iOS上使用单独的线程进行联网

Bar*_*obs 3 networking multithreading ios

我开发的应用程序是一个与OS X服务器通信的iOS客户端.此应用程序的当前版本执行主线程上的所有网络逻辑,这适用于我想要做的事情.

但是,在下一个版本中,我希望网络逻辑更加灵活.为了实现这一点,我想为它提供一个单独的线程,但我不确定哪种解决方案适合我的需求.

起初,GCD看起来是一个很好的候选者,但它似乎只适合在一个单独的线程上执行的大块工作.我想要做的是将所有网络逻辑放在一个单独的线程上.iOS客户端和OS X服务器之间的连接是持久的,所有数据流和处理都应该在该单独的线程上进行.

问题归结为,哪种方法最适合这种情况?

编辑:为了消除任何混淆,我使用的连接使用套接字和NSStream实例.我不是在处理连接到远程Web服务器.换句话说,AFNetworking和ASIHttpRequest对我来说不是一个选择.

vag*_*ase 5

  1. 您可以使用runloop创建一个线程(我们称之为NetworkThread),运行以下代码:

    while (!self.isCancelled) {
        NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
        [[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate distantFuture]];
        [pool release];
    }
    
    Run Code Online (Sandbox Code Playgroud)
  2. 然后,您可以使用- (void)performSelector:(SEL)aSelector onThread:(NSThread *)thr withObject:(id)arg waitUntilDone:(BOOL)wait在NetworkThread上执行网络请求选择器.

  3. 将在NetworkThread上调用所有网络回调,然后在NetworkThread上处理响应数据,将最终数据推送到主线程,更新UI.