Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/117.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 通过NSStream确定成功建立连接和断开连接_Ios_Macos_Sockets_Foundation_Cfnetwork - Fatal编程技术网

Ios 通过NSStream确定成功建立连接和断开连接

Ios 通过NSStream确定成功建立连接和断开连接,ios,macos,sockets,foundation,cfnetwork,Ios,Macos,Sockets,Foundation,Cfnetwork,我正在尝试为NSStream编写类似于包装器的东西,以使我的生活更轻松。我只想知道什么时候建立连接,什么时候关闭,写一些数据,获取接收到的数据。所以我在想这样的事情: 标题: @interface StreamWrapper : NSObject - (id)initWithDelegate:(id <StreamWrapperDelegate>)delegate; - (void)writeData:(NSData *)data; @end @protocol StreamW

我正在尝试为
NSStream
编写类似于包装器的东西,以使我的生活更轻松。我只想知道什么时候建立连接,什么时候关闭,写一些数据,获取接收到的数据。所以我在想这样的事情:

标题:

@interface StreamWrapper : NSObject

- (id)initWithDelegate:(id <StreamWrapperDelegate>)delegate;
- (void)writeData:(NSData *)data;

@end

@protocol StreamWrapperDelegate <NSObject>

@required
- (void)streamWrapper:(StreamWrapper *)streamWrapper didReceiveData:(NSData *)data;
- (void)streamWrapperDidConnect:(StreamWrapper *)streamWrapper;
- (void)streamWrapperDidCloseConnection:(StreamWrapper *)streamWrapper;

@end
@接口流包装器:NSObject
-(id)initWithDelegate:(id)delegate;
-(无效)写入数据:(NSData*)数据;
@结束
@协议StreamWrapperDelegate
@必需的
-(void)streamWrapper:(streamWrapper*)streamWrapper didReceiveData:(NSData*)数据;
-(void)streamWrapperDidConnect:(StreamWrapper*)StreamWrapper;
-(void)streamWrapperDidCloseConnection:(StreamWrapper*)StreamWrapper;
@结束
类别:

@interface StreamWrapper () <NSStreamDelegate>

...
@property (nonatomic, weak) id <StreamWrapperDelegate> delegate;
@property (nonatomic, strong) NSInputStream *inputStream;
@property (nonatomic, strong) NSOutputStream *outputStream;

- (void)closeStreams;
- (void)setAndOpenStreams;

@end

@implementation StreamWrapper

#pragma mark - NSStreamDelegate

- (void)stream:(NSStream *)aStream handleEvent:(NSStreamEvent)eventCode
{
    switch (eventCode) {

        case NSStreamEventEndEncountered:
            // Should I here close both streams (even if this is called only for one (in or out)) and delegate closed connection?
            break;

        case NSStreamEventErrorOccurred:
            // Should I here close both streams (even if this is called only for one (in or out)) and delegate closed connection?
            break;

        case NSStreamEventHasBytesAvailable:
            // My reading algorithm... 
            [self.delegate streamWrapper:self didReceiveData:data];
            break;

        case NSStreamEventHasSpaceAvailable:
            // Is this useful for me?
            break;

        case NSStreamEventNone:
            // Is this useful for me?
            break;

        case NSStreamEventOpenCompleted:
            // Should I here delegate successful connection? Should I wait to receive this for both streams? How?
            break;

        default:
            break;
    }
}

...

@end
@接口流包装器()
...
@属性(非原子,弱)id委托;
@属性(非原子,强)NSInputStream*inputStream;
@属性(非原子,强)NSOutputStream*outputStream;
-(无效)封闭溪流;
-(无效)setAndOpenStreams;
@结束
@实现流包装器
#pragma标记-NSStreamDelegate
-(void)流:(NSStream*)aStream handleEvent:(NSStreamEvent)事件代码
{
开关(事件代码){
案件被驳回:
//在这里,我是否应该关闭两个流(即使只为一个流(in或out)调用),并委托关闭的连接?
打破
发生错误的案例:
//在这里,我是否应该关闭两个流(即使只为一个流(in或out)调用),并委托关闭的连接?
打破
案例NSTRAVENTHASBYTES可用:
//我的阅读算法。。。
[self.delegate streamWrapper:self-didReceiveData:data];
打破
案例NSSTREATEVENTHASSPACE可用:
//这对我有用吗?
打破
案例1:文通:
//这对我有用吗?
打破
已完成的案例:
//我应该在这里委托成功的连接吗?我应该等待接收这两个流吗?如何?
打破
违约:
打破
}
}
...
@结束
所以。。。如何实现这一点,我将始终知道何时建立连接,我能够发送和接收数据,何时连接断开(即使只有一种方式),我应该关闭它并尝试全新的建立?或者,做这样的事情的正确方法是什么?

根据

  • 有关更多信息,请参阅本文:


我以前使用NSStream的经验是捕获第一个NSStreamVenthassspaceAvailable事件作为建立连接的信号


当出现错误或消息已完成时,我也会将输入流和输出流置为零,因此我只需要在writeData:方法中检查这些流是否为零。

我讨厌这种回答,但在这种情况下,这是我应得的。如果这不能解决您的问题,我可以为您提供一个示例源代码。我正在做的那件事好吧,我想现在我能做了,但如果可能的话,我也想看看你的解决方案。
 NSStreamEventNone
 No event has occurred.

 Available in OS X v10.3 and later.

 Declared in NSStream.h.

 NSStreamEventOpenCompleted
 The open has completed successfully.

 Available in OS X v10.3 and later.

 Declared in NSStream.h.

 NSStreamEventHasBytesAvailable
 The stream has bytes to be read.

  Available in OS X v10.3 and later.

 Declared in NSStream.h.

 NSStreamEventHasSpaceAvailable
 The stream can accept bytes for writing.

 Available in OS X v10.3 and later.

 Declared in NSStream.h.

 NSStreamEventErrorOccurred
 An error has occurred on the stream.

 Available in OS X v10.3 and later.

 Declared in NSStream.h.

 NSStreamEventEndEncountered
 The end of the stream has been reached.

 Available in OS X v10.3 and later.

 Declared in NSStream.h.