详细解析几个和网络请求有关的类(二十二) —— NSStream(一)

版本记录

版本号 时间
V1.0 2018.03.18

前言

我们做APP发起网络请求,一般都是使用框架,这些框架的底层也都是苹果的API,接下来几篇就一起来看一下和网络有关的几个类。感兴趣的可以看上面几篇文章。
1. 详细解析几个和网络请求有关的类 (一) —— NSURLSession
2. 详细解析几个和网络请求有关的类(二) —— NSURLRequest和NSMutableURLRequest
3. 详细解析几个和网络请求有关的类(三) —— NSURLConnection
4. 详细解析几个和网络请求有关的类(四) —— NSURLSession和NSURLConnection的区别
5. 详细解析几个和网络请求有关的类(五) —— 关于NSURL加载系统(一)
6. 详细解析几个和网络请求有关的类(六) —— 使用NSURLSession(二)
7. 详细解析几个和网络请求有关的类(七) —— URL数据的编码和解码(三)
8. 详细解析几个和网络请求有关的类(八) —— 处理重定向和其他请求更改(四)
9. 详细解析几个和网络请求有关的类(九) —— 身份验证挑战和TLS链验证(五)
10. 详细解析几个和网络请求有关的类(十) —— 理解获取缓存(六)
11. 详细解析几个和网络请求有关的类(十一) —— Cookies和自定义协议(七)
12. 详细解析几个和网络请求有关的类(十二) —— URL Session的生命周期(八)
13. 详细解析几个和网络请求有关的类(十三) —— NSURLResponse(一)
14. 详细解析几个和网络请求有关的类(十四) —— NSHTTPCookie(一)
15. 详细解析几个和网络请求有关的类(十五) —— NSHTTPCookieStorage(一)
16. 详细解析几个和网络请求有关的类(十六) —— NSURLCache(一)
17. 详细解析几个和网络请求有关的类(十七) —— NSCachedURLResponse(一)
18. 详细解析几个和网络请求有关的类(十八) —— NSURLAuthenticationChallenge(一)
19. 详细解析几个和网络请求有关的类(十九) —— NSURLProtectionSpace(一)
20. 详细解析几个和网络请求有关的类(二十) —— NSURLCredential(一)
21. 详细解析几个和网络请求有关的类(二十一) —— NSURLCredentialStorage(一)

回顾

上一篇讲述了NSURLCredentialStorage这个类的详细信息以及一些注意要点,下面这篇我们就主要看一下NSStream


Overview

表示流的抽象类。

下面看一下该类的基本信息。

这个类的接口对于所有Cocoa流类都是通用的,包括其具体的子类NSInputStreamNSOutputStream

NSStream对象提供了一种简单的方法,以独立于设备的方式读写数据到各种媒体。 您可以为位于内存,文件或网络(使用套接字)的数据创建流对象,并且可以使用流对象,而无需将所有数据一次加载到内存中。

默认情况下,非基于文件的NSStream实例是不可查找的单向流(虽然可以使用自定义可搜索的子类)。 一旦数据被提供或使用,数据不能从流中检索。


Subclassing Notes

NSStream是一个抽象类,不能实例化和被分类。 它发布了所有子类必须采用并提供实现的编程接口。 NSStream两个Apple提供的具体子类NSInputStreamNSOutputStream适用于大多数使用目的。 但是,当你想要一个对等子类到NSInputStreamNSOutputStream时,可能会出现这种情况。 例如,您可能需要一个实现全双工(双向)流的类,或者其实例能够通过流进行搜索的类。

1. Methods to Override - 重写的方法

所有的子类都必须完全实现以下方法,这些方法以函数对的形式呈现。

  • open and close

    • 实现open方法以打开流以进行读取或写入,并将流直接提供给客户端,或者如果将流对象在运行循环中调度,则可以将其传递给代理。 如有必要,执行close方法关闭流并从运行循环中移除流对象。 closed的流应该仍然能够接受新的属性并报告其当前属性。 流一旦关闭,就不能重新打开。
  • delegate and delegate

    • 返回并设置代理。 默认情况下,流对象必须是它自己的代理; 所以一个参数为nil的代理消息应该还原这个代理。 不要保留代理以防止引用循环。
    • 要了解代理和Delegation,请阅读Cocoa Fundamentals Guide中的“ Delegation”。
  • scheduleInRunLoop:forMode: and removeFromRunLoop:forMode:

    • 实现scheduleInRunLoop:forMode:在指定的运行循环中调度指定模式的流对象。 实现removeFromRunLoop:forMode:从运行循环中删除对象。 有关详细信息,请参阅NSRunLoop类的文档。 一旦打开流的流对象在运行循环中被调度,它将处理流数据以发送stream:handleEvent:消息到其代理,这是子类的责任。
  • propertyForKey: and setProperty:forKey:

    • 实现这些方法分别返回和设置指定键的属性值。 您可以添加自定义属性,但一定要处理由NSStream定义的所有属性。
  • streamStatus and streamError

    • 实现streamStatus以将该流的当前状态作为NSStreamStatus常量返回;您可以定义新的NSStreamStatus常量,但一定要正确处理NSStream定义的常量。 实现streamError返回表示当前错误的NSError对象。 您可能会决定返回一个自定义NSError对象,该对象可以提供关于错误的完整和本地化信息。

Topics

1. Creating Streams - 创建流

2. Configuring Streams - 配置流

3. Using Streams - 使用流

4. Managing Run Loops - 管理运行循环

5. Getting Stream Information - 获取流信息

6. Constants

7. Type Methods


API

下面看一下该类的API接口。

1. NSStream本类

NSStream是一个将公共API封装到NSInputStreamNSOutputStream的抽象类。NSInputStreamNSOutputStream的子类也必须实现这些方法

// NSStream is an abstract class encapsulating the common API to NSInputStream and NSOutputStream.
// Subclassers of NSInputStream and NSOutputStream must also implement these methods.
@interface NSStream : NSObject

- (void)open;
- (void)close;

@property (nullable, assign) id <NSStreamDelegate> delegate;
    // By default, a stream is its own delegate, and subclassers of NSInputStream and NSOutputStream must maintain this contract. [someStream setDelegate:nil] must restore this behavior. As usual, delegates are not retained.

- (nullable id)propertyForKey:(NSStreamPropertyKey)key;
- (BOOL)setProperty:(nullable id)property forKey:(NSStreamPropertyKey)key;

- (void)scheduleInRunLoop:(NSRunLoop *)aRunLoop forMode:(NSRunLoopMode)mode;
- (void)removeFromRunLoop:(NSRunLoop *)aRunLoop forMode:(NSRunLoopMode)mode;

@property (readonly) NSStreamStatus streamStatus;
@property (nullable, readonly, copy) NSError *streamError;

@end

2. NSStream分类NSSocketStreamCreationExtensions

@interface NSStream (NSSocketStreamCreationExtensions)

+ (void)getStreamsToHostWithName:(NSString *)hostname port:(NSInteger)port inputStream:(NSInputStream * _Nullable * _Nullable)inputStream outputStream:(NSOutputStream * _Nullable * _Nullable)outputStream API_AVAILABLE(macos(10.10), ios(8.0), tvos(9.0)) __WATCHOS_PROHIBITED;

#if (TARGET_OS_MAC && !(TARGET_OS_EMBEDDED || TARGET_OS_IPHONE))
+ (void)getStreamsToHost:(NSHost *)host port:(NSInteger)port inputStream:(NSInputStream * _Nullable * _Nullable)inputStream outputStream:(NSOutputStream * _Nullable * _Nullable)outputStream API_DEPRECATED("Please use getStreamsToHostWithName:port:inputStream:outputStream: instead", macos(10.3,10.10)) API_UNAVAILABLE(ios, watchos, tvos);
#endif

@end

3. NSStream分类NSStreamBoundPairCreationExtensions

@interface NSStream (NSStreamBoundPairCreationExtensions)

+ (void)getBoundStreamsWithBufferSize:(NSUInteger)bufferSize inputStream:(NSInputStream * _Nullable * _Nullable)inputStream outputStream:(NSOutputStream * _Nullable * _Nullable)outputStream API_AVAILABLE(macos(10.10), ios(8.0), watchos(2.0), tvos(9.0));

@end

4. NSStream协议

@protocol NSStreamDelegate <NSObject>

@optional
- (void)stream:(NSStream *)aStream handleEvent:(NSStreamEvent)eventCode;

@end

这里,代理里面有一个枚举,如下定义:

typedef NS_OPTIONS(NSUInteger, NSStreamEvent) {
    NSStreamEventNone = 0,
    NSStreamEventOpenCompleted = 1UL << 0,
    NSStreamEventHasBytesAvailable = 1UL << 1,
    NSStreamEventHasSpaceAvailable = 1UL << 2,
    NSStreamEventErrorOccurred = 1UL << 3,
    NSStreamEventEndEncountered = 1UL << 4
};

后记

本篇主要介绍了类NSStream的基本信息和使用方法,喜欢的给个赞或者关注,谢谢~~~

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,864评论 6 494
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,175评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,401评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,170评论 1 286
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,276评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,364评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,401评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,179评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,604评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,902评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,070评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,751评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,380评论 3 319
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,077评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,312评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,924评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,957评论 2 351

推荐阅读更多精彩内容