2015-11-07 11 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

Что именно не работает? Не являются ли делегированные методы all или только те, которые предоставляют данные? Вы пытаетесь подключиться несколько раз к одному и тому же адресу и порту? –

+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.

Я отправил код, который потоки видео с одной прошивки к другому:

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

Построить это приложение с Xcode 11; запустить его на двух устройствах iOS 11.

Коснитесь значка камеры на одном из двух устройств, чтобы запустить потоковое видео в реальном времени.

Если у вас нет двух устройств, вы можете запустить приложение в симуляторе; однако, поток только от реального устройства (камера не доступна на симуляторе).