как передавать данные из NSOutputStream в NSInputStream в target-c

У меня есть 2 библиотеки, которые я хочу интегрировать и заставить их общаться друг с другом. Каждый из них слушает свои входные и выходные потоки. Библиотека 1 будет транспортным уровнем для библиотеки 2.

Случай 1: библиотека 1 получает данные в свой входной поток. Я хочу записать данные в другой фиктивный выходной поток, который будет передан во входной поток в библиотеке 2.

Случай 2: Библиотека 2 хочет отправить некоторые данные, поэтому она запишет данные в свой выходной поток. Это должно быть передано в фиктивный входной поток, откуда данные будут считываться и записываться в выходной поток библиотеки 1.

Как создать каналы для этих NSStreams в Objective-C?

Заранее спасибо за ваш вклад.


person Sharath Ambati    schedule 30.01.2015    source источник
comment
Подкласс обоих с классами-оболочками. Один перехватывает данные и ставит их в очередь, другой извлекает из очереди.   -  person Hot Licks    schedule 30.01.2015
comment
Шарату повезло с этим? Я искал, чтобы сделать подобную вещь.   -  person Joshua Book    schedule 06.02.2015
comment
сценарий для меня заключался в том, что обе библиотеки работали с потоковыми событиями независимо. Я написал класс моста: я сделал мост таким образом, чтобы при получении данных в библиотеке 1 он получал NSData и создавал входной поток с [NSInputStream inputStreamWithData: data] и это как входной поток для библиотеки 2. Для случая, когда данные должны были быть отправлены, я напрямую отправил данные в поток вывода библиотеки 2, собрал их в мосте через события потока и записал в поток вывода библиотеки 1.   -  person Sharath Ambati    schedule 07.02.2015


Ответы (2)


Быстрая версия ответа Габриэле Мондады

    var readStream:Unmanaged<CFReadStream>?
    var writeStream:Unmanaged<CFWriteStream>?

    CFStreamCreateBoundPair(nil, &readStream, &writeStream, 4096)

    let inputStream:NSInputStream = readStream!.takeRetainedValue()
    let outputStream:NSOutputStream = writeStream!.takeRetainedValue()
person Dale    schedule 23.09.2016
comment
См. также stackoverflow. com/questions/24028995/ - person Dale; 23.09.2016

Вот как создать простую трубу:

CFReadStreamRef readStream = NULL;
CFWriteStreamRef writeStream = NULL;

CFStreamCreateBoundPair(NULL, &readStream, &writeStream, 4096);

NSInputStream *inputStream = (__bridge_transfer NSInputStream *)readStream;
NSOutputStream *outputStream = (__bridge_transfer NSOutputStream *)writeStream;

То, что вы пишете в outputStream, будет доступно для чтения из inputStream.

person Gabriele Mondada    schedule 12.08.2015
comment
это хреново. Кому нужна такая пара? Обычно у вас есть два потока, связанных с чем-то: файл, сокет, память, парсер xml, поэтому готовые сокеты должны быть связаны друг с другом. - person Marek R; 13.03.2016
comment
Мне это нужно. Спасибо. Смотрите также мой ответ для версии в Swift - person Dale; 23.09.2016
comment
@MarekR Скажем, у меня есть источник данных. Я передаю ему OutputStream для записи. Я хочу загрузить эти данные на сервер; библиотека HTTP принимает файл InputStream. Так что все, что мне нужно, это мост между двумя потоками. - person Raphael; 24.02.2017
comment
@ Рафаэль, ты упустил мою мысль, тебе нужно сделать много шаблонного кода, чтобы передать один поток другому. Эта пара полезна только в одном случае, для передачи данных между потоками (каждый поток запланирован на отдельный цикл событий), в других случаях она совершенно бесполезна. - person Marek R; 16.03.2017