Потоки какао
Потоки обеспечивают простой способ к программе для обмена данными со множеством носителей независящим от устройств способом. Поток является непрерывной последовательностью битов, переданных последовательно по каналу связи. Это однонаправлено и следовательно, с точки зрения программы, поток может быть вводом (или читать), поток или вывод (или запись) поток. За исключением основанных на файле потоков, потоки являются non-seekable — как только потоковые данные были предоставлены или использованы, это не может быть получено снова от потока.
Какао включает три связанных с потоком класса: NSStream
, NSInputStream
, и NSOutputStream
. NSStream
абстрактный класс, определяющий фундаментальный интерфейс и свойства для всех потоковых объектов. NSInputStream
и NSOutputStream
подклассы NSStream
и входной поток значения по умолчанию реализации и поведение потока вывода. Можно создать NSOutputStream
экземпляры для потоковых данных расположились в памяти или записанный в буфер C или файл; можно создать NSInputStream
экземпляры для потоковых данных читали из NSData
возразите или файл. Вы можете также иметь NSInputStream
и NSOutputStream
объекты в конечных точках основанного на сокете сетевого соединения и можно использовать потоковые объекты, не загружая все потоковые данные в память сразу. Рисунок 1 иллюстрирует типы входного потока и объектов потока вывода с точки зрения их источников или мест назначения.
Поскольку они имеют дело с такой основной вычислительной абстракцией (потоки), NSStream
и его подклассы предназначаются для задач программирования низшего уровня. Если существует высокоуровневое Какао API, больше подходящий для определенной задачи (например, NSURL
или NSFileHandle
) используйте его вместо этого.
Потоковым объектам связали свойства с ними. Большинство свойств имеет отношение к сетевой безопасности и конфигурации, а именно, защищенный сокет (SSL) уровни и информация о прокси SOCKS. Два важных дополнительных свойства NSStreamDataWrittenToMemoryStreamKey
, который разрешает извлечение данных, записанных в память для потока вывода, и NSStreamFileCurrentOffsetKey
, который позволяет Вам управлять текущим чтением или позицией записи в основанных на файле потоках.
Потоковому объекту также связали делегата с ним. Если делегат явно не установлен, сам потоковый объект становится делегатом (полезное соглашение для пользовательских подклассов). Потоковый объект вызывает единственный метод делегации stream:handleEvent:
для каждого связанного с потоком события это обрабатывает. Из особого значения события, указывающие, когда байты доступны для чтения из входного потока и когда поток вывода сигнализирует, что это готово принять байты. Для этих двух событий делегат отправляет потоку надлежащее сообщение —read:maxLength:
или write:maxlength:
, В зависимости от типа потока — чтобы получить байты от потока или поместить байты на поток.
NSStream
основан CFStream
уровень Базовой Основы. Эта тесная связь означает что конкретные подклассы NSStream
, NSOutputStream
и NSInputStream
, бесплатный соединенный мостом с их Базовыми дубликатами Основы CFWriteStream
и CFReadStream
. Несмотря на то, что существуют сильные сходства между Какао и Базовым потоком Основы APIs, их реализации не являются точно совпадающими. Потоковые классы Какао используют модель делегации для асинхронного поведения (принимающий планирование цикла выполнения), в то время как Базовая Основа использует клиентские обратные вызовы. Базовые потоковые типы Основы устанавливают клиент (назвал контекст в Базовой Основе), по-другому, чем NSStream устанавливает делегата; вызовы для установки делегата не должны быть смешаны с вызовами для установки контекста. Иначе можно свободно смешать вызовы от двух APIs в коде.
Несмотря на их сильные сходства, NSStream
действительно дает Вам главное преимущество CFStream
. Из-за его основ Objective C это расширяемо. Можно разделить на подклассы NSStream
, NSInputStream
, или NSOutputStream
настроить потоковые атрибуты и поведение. Например, Вы могли создать входной поток, поддерживающий статистику по байтам, которые она читает; или Вы могли сделать a NSStream
разделите на подклассы, чьи экземпляры могут искать через их поток, откладывая считанные байты. NSStream
имеет его собственный набор требуемых переопределений, также, как и NSInputStream
и NSOutputStream
. См. справочную документацию для NSStream
, NSInputStream
, и NSOutputStream
для подробных данных о разделении на подклассы этих классов.