3

私は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

クラス:

@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

それで...接続が確立され、データを送受信できるようになり、接続が切断されたとき(一方向でも)を常に把握し、接続を閉じて新しい確立を試みる必要があることを実装するにはどうすればよいですか?または、このようなことを行うための適切な方法は何ですか?

4

2 に答える 2

2

Appleの開発者ウェブサイトによると

 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.
  • 詳細については、次の記事も参照してください。

記事 : バイト利用可能イベント

記事 : 空席のあるイベント

于 2012-11-01T06:38:26.750 に答える
0

私の以前の NSStream の経験は、最初の NSStreamEventHasSpaceAvailable イベントを接続確立のシグナルとしてキャプチャすることでした。

また、Error または Completed メッセージが発生したときに入力ストリームと出力ストリームを nil アウトします。そのため、writeData: メソッドでこれらのストリームが nil かどうかを確認するだけで済みます。

于 2012-11-02T04:02:16.867 に答える