Потоки какао

Потоки обеспечивают простой способ к программе для обмена данными со множеством носителей независящим от устройств способом. Поток является непрерывной последовательностью битов, переданных последовательно по каналу связи. Это однонаправлено и следовательно, с точки зрения программы, поток может быть вводом (или читать), поток или вывод (или запись) поток. За исключением основанных на файле потоков, потоки являются non-seekable — как только потоковые данные были предоставлены или использованы, это не может быть получено снова от потока.

Какао включает три связанных с потоком класса: NSStream, NSInputStream, и NSOutputStream. NSStream абстрактный класс, определяющий фундаментальный интерфейс и свойства для всех потоковых объектов. NSInputStream и NSOutputStream подклассы NSStream и входной поток значения по умолчанию реализации и поведение потока вывода. Можно создать NSOutputStream экземпляры для потоковых данных расположились в памяти или записанный в буфер C или файл; можно создать NSInputStream экземпляры для потоковых данных читали из NSData возразите или файл. Вы можете также иметь NSInputStream и NSOutputStream объекты в конечных точках основанного на сокете сетевого соединения и можно использовать потоковые объекты, не загружая все потоковые данные в память сразу. Рисунок 1 иллюстрирует типы входного потока и объектов потока вывода с точки зрения их источников или мест назначения.

  Источники рисунка 1 и места назначения потоковых объектов
Sources and destinations of stream objects

Поскольку они имеют дело с такой основной вычислительной абстракцией (потоки), 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 для подробных данных о разделении на подклассы этих классов.