0

私はこの質問を試してみまし た: デリゲートはどのように機能しますか?まだ完全に把握していないようです. CocoaAsyncSocket ライブラリを使用して TCP ソケット接続を作成しようとしています。非常にフレンドリーな SO ユーザーの助けのおかげで、サーバーへのデータ読み取り要求を実行する次のコードがあります。

- (void)onSocket:(AsyncSocket *)sock didReadData:(NSData *)data withTag:(long)tag
{
    NSData *strData = [data subdataWithRange:NSMakeRange(0, [data length])];
    NSString *msg = [[NSString alloc] initWithData:strData encoding:NSUTF8StringEncoding];
    if(msg)
    {
        NSLog(@"RX:%@",msg);
    }
}

さて、私は iOS 開発にかなり慣れていないので、私の無知を許してください。これで、ReadData を実行する呼び出したいメソッドができました。問題は、このメソッドを配置する場所がわからないことです (いくつかのビューがあり、いくつかのヘッダー/実装ファイルがあります)。このメソッドをデリゲート メソッドにしたいのですが、デリゲート メソッドにする方法がわかりません。ビューからこのデリゲート メソッドを呼び出したいと思います。

誰かが説明できれば:

  • このコードはどこに置くのですか? (どのファイルなど)
  • これをデリゲート メソッドにするにはどうすればよいですか?
  • このデリゲート メソッドを呼び出すにはどうすればよいですか?

私はこれに一日中立ち往生しており、タオルを投げようとしています笑。どんな助けでも大歓迎です。本当にありがとう!

編集:

これは前の質問からの橋渡しのようなものですが、その質問がこの質問とあまり関連しているとは思いません。 質問

4

3 に答える 3

0

私はこの- (void)onSocket:(AsyncSocket *)sock didReadData:(NSData *)data withTag:(long)tag 方法に精通していませんが、iOS でデリゲートを使用することは、いくつかの依存関係を導入することなくオブジェクト間で通信するための非常に一般的な方法です。

以下に、箇条書きの 3 つの質問に答えるヒントをいくつか示します。

このコードはどこに置くのですか?

最善の策は、ReadData を実行するコントローラー内または appDelegate 内です。

これをデリゲート メソッドにするにはどうすればよいですか?

このメソッドがプロトコルで定義されている場合、これは定義により既にデリゲート メソッドです。ViewController クラスをこのプロトコルに準拠させ、コントローラをこのメソッドのデリゲートにするだけです。

このデリゲート メソッドを呼び出す方法

デリゲート メソッドを呼び出しません。このデリゲート メソッドを呼び出す、この CocoaAsyncSocket ライブラリに属する​​別のオブジェクトがあります。このメソッドを処理するオブジェクトとしてコントローラーを定義したため、コントローラーのデリゲート メソッド内でいくつかのコードを処理するだけです。

一部の作業を他のオブジェクトに延期する方法としてデリゲートを見てください(これはデザインパターンです)

于 2012-06-05T21:03:13.357 に答える
0

更新していただきありがとうございます。より明確になりました。ここにいくつかの答えがあります。不明な場合はお知らせください。

- このコードはどこに置くのですか? (どのファイルなど)

のデリゲート メソッドですCocoaAsyncSocket。最初の質問に戻ります。初期化したときに、自分自身 (appDelegate) をデリゲートとして設定しました。

socket = [[AsyncSocket alloc] initWithDelegate:self];

つまり、別のクラスから呼び出されます。つまり、このメソッドは、オブジェクト (ここではsocket) を初期化し、デリゲートとして設定したのと同じクラスにある必要があります。したがって、appDelegate にとどまります

- これをデリゲート メソッドにするにはどうすればよいですか?

あなたはそうしない。これはデリゲート メソッドそのものです。

- このデリゲート メソッドを呼び出すにはどうすればよいですか?

あなたはそうしない。別のクラス (ここではAsyncSocket) がそれを呼び出します。

にデータを渡す方法を尋ねることができますviewControllersか? それはあなたのデザインに依存します。このメソッドが呼び出され、接続があり、データが読み取られていることが通知されたら、設計に応じて、データを他のビュー コントローラーに渡します。1 つの方法は、を使用することNSNotificationです。例えば

// Call this in onSocket:didReadData:withTag: instead of logging
[[NSNotificationCenter defaultCenter] postNotificationName:@"DataIsReadNotification" object:msg]



// In one of your view controllers
// View controllers insterested in this message, register to get notified:
// add to -viewDidLoad
[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(updateViewWithNotification:) name:@"DataIsReadNotification" object:nil];
...
// and somewhere in the view controller class implement this
- (void)updateViewWithNotification:(NSNotification *)notification {
NSString *msg = [notification object];
}
于 2012-06-05T20:57:24.043 に答える
0

デリゲートを作成するには、ヘッダー ファイルでその内容を宣言します。以下の例。

//SomeClass.h

@protocol SomeClassDelegate <NSObject>
- (void)onSocket:(AsyncSocket *)sock didReadData:(NSData *)data withTag:(long)tag;
@end


@interface SomeClass : NSObject {

id<SomeClassDelegate>delegate;

}
@property(nonatomic,assign)id<SomeClassDelegate>delegate;
@end

これで、SomeClass を初期化するときに、delegateself が何であれ、を設定できます。SomeClassファイルで、次のことができます

[self.delegate onSocket: .. didReadData: .. withTag:];

SomeClass へのデリゲートとして設定したクラスにメソッドが存在する場合は、そのメソッドが呼び出されます。お役に立てれば。

于 2012-06-05T21:06:00.430 に答える