2015-11-07 32 views
1

我的應用程序使用NSInputStream象下面這樣:的iOS我如何可以執行多個NSInputStream

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

和委託:

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

它工作正常,但所有其他請求我做什麼,排隊,直到第一完成。 我可以每次做一個,並且沒有辦法做多個併發請求。

有解決方案嗎? 謝謝

這個解決方案不是爲我工作: https://stackoverflow.com/a/15346292/1376961

UPDATE: 是我的服務器無法處理來自同一來源的多個連接。

回答

2

您將需要在不同的線程中創建您的流,以使它們能夠同時工作。我假設你有一個設置你提到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

0

您可以嘗試在自己的運行循環中安排每個流。下面是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; 
} 
1

每次我創建一個新的NSInputStream,我把它添加到一個塊對象,然後存儲在一個NSMutableArray塊對象。

我貼的代碼,流視頻從一個iOS的另一個:

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

構建這個應用程序和Xcode 11;在兩臺iOS 11設備上運行它。

觸摸兩臺設備中的一臺設備上的相機圖標開始流式傳輸實時視頻。

如果您沒有兩個設備,您可以在模擬器中運行應用程序;但是,僅從真實設備傳輸(相機在模擬器上不可用)。

相關問題