- 详细解析几个和网络请求有关的类
- 详细解析几个和网络请求有关的类(二十二) —— NSStream
- 详细解析几个和网络请求有关的类 (一) —— NSURLSess
- 详细解析几个和网络请求有关的类(二) —— NSURLReque
- 详细解析几个和网络请求有关的类(三) —— NSURLConne
- 详细解析几个和网络请求有关的类(十三) —— NSURLResp
- 详细解析几个和网络请求有关的类(十六) —— NSURLCach
- 详细解析几个和网络请求有关的类(十七) —— NSCachedU
- 详细解析几个和网络请求有关的类(十八) —— NSURLAuth
- 详细解析几个和网络请求有关的类(二十) —— NSURLCred
版本记录
版本号 | 时间 |
---|---|
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流类都是通用的,包括其具体的子类NSInputStream和NSOutputStream。
NSStream对象提供了一种简单的方法,以独立于设备的方式读写数据到各种媒体。 您可以为位于内存,文件或网络(使用套接字)的数据创建流对象,并且可以使用流对象,而无需将所有数据一次加载到内存中。
默认情况下,非基于文件的NSStream实例是不可查找的单向流(虽然可以使用自定义可搜索的子类)。 一旦数据被提供或使用,数据不能从流中检索。
Subclassing Notes
NSStream
是一个抽象类,不能实例化和被分类。 它发布了所有子类必须采用并提供实现的编程接口。 NSStream两个Apple提供的具体子类NSInputStream
和NSOutputStream
适用于大多数使用目的。 但是,当你想要一个对等子类到NSInputStream
和NSOutputStream
时,可能会出现这种情况。 例如,您可能需要一个实现全双工(双向)流的类,或者其实例能够通过流进行搜索的类。
1. Methods to Override - 重写的方法
所有的子类都必须完全实现以下方法,这些方法以函数对的形式呈现。
-
- 实现
open
方法以打开流以进行读取或写入,并将流直接提供给客户端,或者如果将流对象在运行循环中调度,则可以将其传递给代理。 如有必要,执行close
方法关闭流并从运行循环中移除流对象。closed
的流应该仍然能够接受新的属性并报告其当前属性。 流一旦关闭,就不能重新打开。
- 实现
-
- 返回并设置代理。 默认情况下,流对象必须是它自己的代理; 所以一个参数为nil的代理消息应该还原这个代理。 不要保留代理以防止引用循环。
- 要了解代理和Delegation,请阅读
Cocoa Fundamentals Guide
中的“ Delegation”。
-
scheduleInRunLoop:forMode: and removeFromRunLoop:forMode:
- 实现
scheduleInRunLoop:forMode:
在指定的运行循环中调度指定模式的流对象。 实现removeFromRunLoop:forMode:
从运行循环中删除对象。 有关详细信息,请参阅NSRunLoop
类的文档。 一旦打开流的流对象在运行循环中被调度,它将处理流数据以发送stream:handleEvent:
消息到其代理,这是子类的责任。
- 实现
-
propertyForKey: and setProperty:forKey:
- 实现这些方法分别返回和设置指定键的属性值。 您可以添加自定义属性,但一定要处理由
NSStream
定义的所有属性。
- 实现这些方法分别返回和设置指定键的属性值。 您可以添加自定义属性,但一定要处理由
-
- 实现
streamStatus
以将该流的当前状态作为NSStreamStatus常量返回;您可以定义新的NSStreamStatus
常量,但一定要正确处理NSStream定义的常量。 实现streamError
返回表示当前错误的NSError对象。 您可能会决定返回一个自定义NSError对象,该对象可以提供关于错误的完整和本地化信息。
- 实现
Topics
1. Creating Streams - 创建流
-
+ getStreamsToHost:port:inputStream:outputStream:- 通过引用创建并返回给定端口上给定主机的套接字连接的
NSInputStream
对象和NSOutputStream
对象。
- 通过引用创建并返回给定端口上给定主机的套接字连接的
2. Configuring Streams - 配置流
-
- propertyForKey:
- 返回给定key的接受者属性。
-
- setProperty:forKey:
- 尝试设置接收器的给定属性的值,并返回一个布尔值,指示该值是否被接收器接受。
-
delegate
- 设置接受者的代理。
3. Using Streams - 使用流
4. Managing Run Loops - 管理运行循环
-
- scheduleInRunLoop:forMode:
- 在给定模式下在给定运行循环中调度接收器。
-
- removeFromRunLoop:forMode:
- 在给定模式下运行的给定运行循环中删除接收器。
5. Getting Stream Information - 获取流信息
-
streamStatus
- 返回接受者状态
-
streamError
- 返回一个代表流错误的NSError对象。
6. Constants
-
- 为Stream Status Constants中列出的常量声明的类型。
-
- 这些常量表示流的当前状态。 它们由
streamStatus
返回。
- 这些常量表示流的当前状态。 它们由
-
- 描述可以送到代理的常数,作为stream:handleEvent:第二个参数中的位域以指定流事件的类型。
-
NSStreamNetworkServiceTypeValue
- NSStream定义了这些字符串常量,用于指定流的服务类型。
-
- NSStream定义了用于指定安全套接字层(SSL)安全级别的这些字符串常量。
-
- NSStream将这些字符串常量定义为使用
propertyForKey:
访问流属性的键,并使用setProperty:
设置属性。
- NSStream将这些字符串常量定义为使用
-
- 报告SSL错误时由NSError使用的错误域。
-
- 报告
SOCKS
错误时由NSError使用的错误域。
- 报告
7. Type Methods
-
+ getBoundStreamsWithBufferSize:inputStream:outputStream:`
- 通过引用创建并返回一对绑定的输入和输出流。
API
下面看一下该类的API接口。
1. NSStream本类
NSStream
是一个将公共API封装到NSInputStream
和NSOutputStream
的抽象类。NSInputStream
和NSOutputStream
的子类也必须实现这些方法
// 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的基本信息和使用方法,喜欢的给个赞或者关注,谢谢~~~
网友评论