美文网首页好文章收藏夹
详细解析几个和网络请求有关的类(二十二) —— NSStream

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

作者: 刀客传奇 | 来源:发表于2018-03-18 22:39 被阅读33次

版本记录

版本号 时间
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的基本信息和使用方法,喜欢的给个赞或者关注,谢谢~~~

相关文章

网友评论

    本文标题:详细解析几个和网络请求有关的类(二十二) —— NSStream

    本文链接:https://www.haomeiwen.com/subject/hrmcqftx.html