ios开发之streams概览

Wesley13
• 阅读 559

流是位数据通过通信路径的连续传送序列。它是单向的,从一个应用程序的角度,流可以是输入流(读操作流)或者输出流(写操作流),除了基于文件的流之外,其余的都是non-seekable的。一旦流数据被提供或者被使用,数据就不能够从流中获取到。

Cocoa包括三种与流有关的类:NSStream,NSInputStream,NSOutputStream. NSStream是抽象类,它定义了流对象的基本接口和属性。NSInputStream和NSOutputStream是NSStream的子类,它们实现了输入流和输出流的基本操作。你可以为存储在内存中,向文件或者C buffer写的流数据创建NSOutputStream对象;可以为从NSData对象和文件中读取的流数据创建NSInputStream对象;也可以在网络套接字的两端创建NSInputStream和NSOutputStream对象,通过流对象,你可以不用一次性将所有的流数据加载到内存中。下图是就输入流和输出流对象的源和目的地为依据对输入流和输出流的分类:

ios开发之streams概览

NSStream及其子类进行的是比较底层的开发,对于某些特殊的需求如果有顶层的Cocoa API更加适合的话(比如NSURL,NSFileHandle),那么就用顶层的API进行编程。

流对象有许多属性,大多数属性都和网络安全及其配置有关,也就是SSL和SOCKS代理信息。另外有两个重要的属性,一个是NSStreamDataWrittenToMemoryStreamKey,对于一个输出流它可以用来获取到写入内存中的数据。另一个是NSStreamFileCurrentOffsetKey,对于一个基于文件的流,可以用它操作读或者写的位置。

每个流对象都有一个与其相关联的delegate,如果其delegate没有显示的设置,那么这个流对象自身成为其delegate(对于自定义子类的话这是一个很有用的约定)。流对象调用它唯一的delegate方法stream:handleEvent:来处理所有与stream-related事件。对于传入参数中的events事件,它指示了什么时候输入流中有数据可供读入,什么时候输出流中有空间可供数据写入。对于这两个事件中的NSStreamEventHasBytesAvailable事件,delegate向该stream发送read:maxLength:消息从流中读取数据,对于NSStreamHasSpaceAvailable事件,delegate向该stream发送write:maxlength:向流中写入数据。

NSStream是建立在Core Foundation的CFStream层之上的。这层紧密的关系意味着NSStream的具体子类-NSInputStream和NSOutputStream与Core Foundation中的CFReadStream和CFWriteStream是一一对应的。尽管Cocoa和Core Foundation的stream APIs有很大的相似性,但是它们的实现却不尽相同,Cocoa stream类使用delegate模式来实现异步操作(比如将其布置在run loop之上),而Core Foundation使用客户端的回调。Core Foundation的stream类型设置的是client(在Core Foundation中叫做context),NSStream中设置的delegate,这是两个不同的概念,不应该把设置delegate和设置context搞混淆。

相比CFStream而言,NSStream有更强的可扩展性,你可以生成NSStream,NSInputStream,NSOutputStream的子类来自定义其属性和方法。For example, you could create an input stream that maintains statistics on the bytes it reads; or you could make a NSStream subclass whose instances can seek through their stream, putting back bytes that have been read. NSStream has its own set of required overrides, as do NSInputStream and NSOutputStream.

点赞
收藏
评论区
推荐文章
blmius blmius
2年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Wesley13 Wesley13
2年前
TS流 PS流 ES流
IP数据报有首部和数据两部分组成的,首部的前一部分是固定长度20字节,是所有IP数据报必须具有的。首部包括:总长度、标识、MF、DF、片偏移。 数字信号实际传送的是数据流,一般数据流包括以下三种:ES流:也叫基本码流,包含视频、音频或数据的连续码流。PES流:也叫打包的基本码流,是将基本的码流ES流根据需要分成长度不等的数据包,并加上包
Wesley13 Wesley13
2年前
IO(输入输出)
IO流有很多种,按照操作数据的不同,可以分为字节流和字符流,按照数组传输方向的不同又可分为输入流和输出流。字节流的输入输出流分别用java.io.InputStream和java.io.OutputStream表示,字符流的输入输出流分别用java.io.Reader和java.io.Writer表示。!(https://oscimg
Wesley13 Wesley13
2年前
Java IO输入输出
学前知道Java的IO使用“流”的概念来表示。IO流涉及到数据源和目的地。流,是从源“流向”目的的数据流。Java将各种数据源和目标之间数据的传输统一抽象为流,通过对流对象的操作来完成I/O功能。输入输出实际都是对内存而言的。数据源可以是键盘、文件、应用程序、鼠标、网络连接。
Stella981 Stella981
2年前
React的单向数据流与组件间的沟通
今天来给大家总结下React的单向数据流与组件间的沟通。首先,我认为使用React的最大好处在于:功能组件化,遵守前端可维护的原则。先介绍单向数据流吧。React单向数据流:React是单向数据流,数据主要从父节点传递到子节点(通过props)。如果顶层(父级)的某个props改变了,React会重渲染所有的子节点。刚才我们提到了
Wesley13 Wesley13
2年前
Java学习:Stream流式思想
Stream流Java8API添加了一种新的机制——Stream(流)。Stream和IO流不是一回事。流式思想:像生产流水线一样,一个操作接一个操作。使用Stream流的步骤:数据源→转换成流→操作1→操作2→……数据源(source):可以是集合、数组等。St
Wesley13 Wesley13
2年前
Java工作流引擎
1.关键字工作流开发框架权限设计、用户组、岗位、集团模式应用.java工作流程引擎,.net工作流引擎,工作流开发框架1.相关的表结构\相关组织\表结构。SELECTNo,Name,ParentNoFROMport\_dept;  部门。SELECTNo,Name,Adminer,AdminerNam
Wesley13 Wesley13
2年前
Java IO
概述Java中输入、输出的处理通过java.io包下的类和接口来支持,在这个包下主要包括输入、输出两种IO流,每种输入、输出流又可以分为字节流和字符流。字节流以字节为单位来处理输入输出,字符流则以字符为单位。除此之外,Java的IO流使用了一种装饰器设计模式,它将IO流分成底层节点流和上层处理流。节点流用于和底层物理存储节点直接关联,不同
Stella981 Stella981
2年前
Socket类的getInputStream方法与getOutputStream方法的使用
客户端上的使用1.getInputStream方法可以得到一个输入流,客户端的Socket对象上的getInputStream方法得到输入流其实就是从服务器端发回的数据。2.getOutputStream方法得到的是一个输出流,客户端的Socket对象上的getOutputStream方法得到的输出流其实就是发送给服务器端的数据。服务器端上的使用
郑天寿 郑天寿
3个月前
观众使用内置 CDN 地址观看的画面分辨率不对或者被裁减问题排查
于观众端订阅的CDN流尺寸不对的问题,建议通过以下方式排查:1、观众端不订阅CDN流,改为订阅MCU流,查看观众订阅MCU流是否显示正确:https://doc.rongcloud.cn/live/IOS/5.X/stream/audience/!订阅多路