的iOS我如何可以执行多个NSInputStream

问题描述:

我的应用程序使用NSInputStream象下面这样:的iOS我如何可以执行多个NSInputStream

inputStream.delegate = self; 
[inputStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode]; 
     [readStream open]; 

和委托:

- (void)stream:(NSStream *)theStream handleEvent:(NSStreamEvent)streamEvent 

它工作正常,但所有其他请求我做什么,排队,直到第一完成。 我可以每次做一个,并且没有办法做多个并发请求。

有解决方案吗? 谢谢

这个解决方案不是为我工作: https://*.com/a/15346292/1376961

UPDATE: 是我的服务器无法处理来自同一来源的多个连接。

您将需要在不同的线程中创建您的流,以使它们能够同时工作。我假设你有一个设置你提到InputStream的方法:

- (void)openStreamInNewThread { 
    [NSThread detachNewThreadSelector:@selector(openStream) toTarget:self withObject:nil]; 
} 

- (void)openStream { 
    NSInputStream *inputStream; 

    // stream setup 

    [inputStream scheduleInRunLoop:[NSRunLoop currentRunLoop] 
        forMode:NSRunLoopCommonModes]; 
} 

注意[NSRunLoop currentRunLoop]将返回当前线程的runloop。所以你有新创建的流在一个单独的线程中运行,并在其自己的线程中同时加载其他流。

+0

尝试并再次尝试,但结果相同。 – Scinfu

+0

究竟什么不行?不是称为ar的委托方法全是或仅提供数据的委托方法?你是否尝试多次连接到相同的地址和端口? –

+0

每次只有一个操作工作,当1完成第二次启动时。我想要所有的NSInputStream下载,是的,相同的端口和相同的主机,但不是相同的FTP文件/ url – Scinfu

您可以尝试在自己的运行循环中安排每个流。下面是the mock类的精制方法设计的单元测试我POSInputStreamLibrary

static const NSTimeInterval kRunLoopCycleInterval = 0.01f; 
static const uint64_t kDispatchDeltaNanoSec = 250000000; 

- (POSRunLoopResult)launchNSRunLoopWithStream:(NSInputStream *)stream delegate:(id<NSStreamDelegate>)streamDelegate { 
    stream.delegate = streamDelegate; 
    __block BOOL breakRunLoop = NO; 
    __block dispatch_semaphore_t doneSemaphore = dispatch_semaphore_create(0); 
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ 
     NSRunLoop *runLoop = [NSRunLoop currentRunLoop]; 
     [stream scheduleInRunLoop:runLoop forMode:NSDefaultRunLoopMode]; 
     if ([stream streamStatus] == NSStreamStatusNotOpen) { 
      NSLog(@"%@: opening stream...", [NSThread currentThread]); 
      [stream open]; 
     } 
     while ([runLoop runMode:NSDefaultRunLoopMode beforeDate:[NSDate dateWithTimeIntervalSinceNow:kRunLoopCycleInterval]] && !breakRunLoop) 
     {} 
     NSLog(@"%@: We are done!", [NSThread currentThread]); 
     dispatch_semaphore_signal(doneSemaphore); 
    }); 
    POSRunLoopResult result = dispatch_semaphore_wait(doneSemaphore, dispatch_time(DISPATCH_TIME_NOW, kDispatchDeltaNanoSec)) == 0 ? POSRunLoopResultDone : POSRunLoopResultTimeout; 
    if (POSRunLoopResultTimeout == result) { 
     breakRunLoop = YES; 
     dispatch_semaphore_wait(doneSemaphore, DISPATCH_TIME_FOREVER); 
    } 
    return result; 
} 

每次我创建一个新的NSInputStream,我把它添加到一个块对象,然后存储在一个NSMutableArray块对象。

我贴的代码,流视频从一个iOS的另一个:

https://app.box.com/s/94dcm9qjk8giuar08305qspdbe0pc784

构建这个应用程序和Xcode 11;在两台iOS 11设备上运行它。

触摸两台设备中的一台设备上的相机图标开始流式传输实时视频。

如果您没有两个设备,您可以在模拟器中运行应用程序;但是,仅从真实设备传输(相机在模拟器上不可用)。