0

さらに説明や詳細が必要な場合は、コメントしてください..

リクエストに基づいてクライアントにメッセージを送信するローカル python サーバーをコンピューターで実行しています。

私は3つのクラスを持つMACクライアントアプリケーションを持っています -

  1. Chatlogic クラス - このクラスは、接続を初期化し、サーバーからメッセージを送受信します。

  2. ログイン クラス - これは、アプリケーションへのユーザーのログインを維持します。このクラスには、Chatlogic クラスのインスタンスがあり、この [chatLogicObject sendmessage: something ]のように、chatlogic クラスのオブジェクトを介してメッセージを送信できます。

私の問題はこれです=受信すると、LoginClassではなくchatLogicクラスインスタンスに来るので、ログインクラスに-(void)messageReceivedというメソッドがあり、chatLogicクラスの同じメソッドをオーバーライドする必要があります(しかし、これはしません仕事)。Loginclass でメソッドを受け取るにはどうすればよいですか?

混乱を避けるために、chatlogic クラスを追加しました

#import <Foundation/Foundation.h>

@interface chatLogic : NSObject <NSStreamDelegate>

@property (copy)NSOutputStream *outputStream;
@property (copy)NSInputStream *inputStream;
@property (copy)NSString *streamStatus;

-(void)initNetworkCommunications;
-(void)sendMessage:(id)sender;
-(void)stream:(NSStream *)aStream handleEvent:(NSStreamEvent)streamEvent;
-(void)messageReceived:(NSString*)message;  //i want this method to be used in some other classes


@end

実装ファイルは以下の通り

「chatLogic.h」をインポート

@実装チャットロジック

@synthesize 入力ストリーム ; @synthesize outputStream ; @synthesize streamStatus;

-(id)init{

if (self == [super init]) {



}
return self;

}

-(void)initNetworkCommunications{

CFReadStreamRef readStream;
CFWriteStreamRef writeStream;
CFStreamCreatePairWithSocketToHost(NULL, (CFStringRef)@"192.168.1.22", 80, &readStream, &writeStream);

inputStream = (__bridge NSInputStream *)readStream;
outputStream = (__bridge NSOutputStream *)writeStream;
[inputStream setDelegate:self];
[outputStream setDelegate:self];
[inputStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
[outputStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
[inputStream open];
[outputStream open];    

}

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

switch (streamEvent) {
    case NSStreamEventOpenCompleted:
        NSLog(@"Stream opened");
        streamStatus = [[NSString alloc]initWithFormat:@"Stream opened"];
        break;
    case NSStreamEventHasBytesAvailable:
        if (aStream == inputStream) {

            uint8_t buffer[1024];
            int len;

            while ([inputStream hasBytesAvailable]) {

                len = (int)[inputStream read:buffer maxLength:sizeof(buffer)];
                if (len > 0) {
                    NSString *output = [[NSString alloc]initWithBytes:buffer length:len encoding:NSASCIIStringEncoding];

                    if (nil != output) {
                        NSLog(@"server said: %@",output);
                        [self messageReceived:output];
                    }
                }
            }
        }
    case NSStreamEventErrorOccurred:
    {
        NSLog(@"cannot connect to the host!");
        break;

    }

    case NSStreamEventEndEncountered:
    {
        break;
    }

    default:
    {   
        NSLog(@"unknown event!!");
    }
}

}

-(void)sendMessage:(id)送信者{

}

-(void)messageReceived:(NSString*)メッセージ{

NSLog(@"the received message in chat logic class");

}

-(void)dealloc{

[inputStream close];
[outputStream close];
[inputStream release];
[outputStream release];
[super dealloc];

}

@終わり

4

2 に答える 2

2

複数のクラスインスタンスで同じメッセージを受け取りたいと思います。最善の方法は、NSNotificationCentre を使用することです。メッセージが 1 つのクラスで受信されるとすぐに、通知を投稿できます。通知は、その通知に登録したすべてのリスナーによって順番に聞かれます。

委任も問題ありませんが、通常、誰がリスナーになるかがわかっている場合に使用されます(あなたのケースで何が起こっているのかわかりません)。これが役立つことを願っています。

アップデート:

はい、いくつかの情報を含むオブジェクトを送信することもできます..このリンクを使用して、オブジェクトで通知を投稿する方法を確認できます

于 2012-06-09T14:13:52.753 に答える
1

私がすべてを正しく理解していれば、ここで委任について話していることになります。( ) のようなメソッドで ChatLogicDelegate プロトコルを定義し-(void)didReceiveMessage:(NSString*)message、デリゲート プロパティを ChatLogic クラスに追加し、それをインスタンス化するときにloginClassObjectをchatLogicObjectのデリゲートに設定する必要があります。ChatLogic クラスでは、必要な[delegate didReceiveMessage:json]ときにいつでも呼び出し、loginClassObjectがメッセージを取得します。

委任に関する Apple のドキュメント

于 2012-06-09T13:45:56.807 に答える