代码之家  ›  专栏  ›  技术社区  ›  Ovi Tisler

不同线程中的简单iphone网络

  •  0
  • Ovi Tisler  · 技术社区  · 15 年前

    我想我的问题源于对iOS平台上不同线程上如何进行网络通信的无知。我有一个 TcpConnection 类,它是打印机的输入和输出流的包装器。这个 Open 电话如下:

        CFStreamCreatePairWithSocketToHost(kCFAllocatorDefault, (CFStringRef) ipAddress, port, &readStream, &writeStream);      
        self.myInputStream = (NSInputStream*)readStream;
        self.myOutputStream = (NSOutputStream*)writeStream;
    
        CFRelease(readStream);
        CFRelease(writeStream);
    
        [self.myInputStream setProperty:(id)kCFBooleanTrue forKey:(NSString *)kCFStreamPropertyShouldCloseNativeSocket];
        [self.myInputStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
        [self.myInputStream open];
    
        [self.myOutputStream setProperty:(id)kCFBooleanTrue forKey:(NSString *)kCFStreamPropertyShouldCloseNativeSocket];
        [self.myOutputStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
        [self.myOutputStream open];
    

    问题在于 [NSRunLoop currentRunLoop] 打电话。当我在不是主线程的线程中创建这个TcpConnection对象时(通过使用 detachNewThreadSelector

    但是,如果我在 mainRunLoop 很好用。但那把我吓坏了。我不知道那会怎么样。这是否意味着所有流通信都在主线程上完成?还有其他性能问题吗?我还没有找到任何在网络上安排网络通信的例子 主回路 ; 那是不是意味着我不应该这么做?当我试图和我的朋友交谈时,我是否使用了错误的线程 TCP连接

    我看了报纸 Threading Programming Guide 但它似乎没有解决这个问题。 任何帮助都将不胜感激

    1 回复  |  直到 15 年前
        1
  •  1
  •   Jason Foreman    15 年前

    通过在主运行循环上进行调度,可以告诉流在主线程上执行其委托回调。这可能是问题,也可能不是问题,这取决于流回调的行为方式。

    我想说,尝试在线程之间传递连接对象是一种设计的味道。我建议使用一个运行自己的run循环的长寿命连接线程。在该线程的run循环上调度流,然后在它和其他线程之间传递消息,以便将数据洗牌到网络上或从网络上洗牌。这将使您的网络通信很好地本地化为单个线程/运行循环。