2

私は C#/Java/JS から ObjectiveC に移行してからまだ数日しか経っていないので、気楽にやってください。

...だから、ブロックをパラメーターとして受け取るメソッドがあります。

-(void)subToPub: (NSString*)publisherName 
      channelId: (NSString*)channelId 
       callback: (void(^)(NSDictionary*))cb

私は通常、次のように使用します。

[myObj  subToPub:@"someId" 
       channelId:@"someOtherId" 
        callback:[(^(NSDictionary* msg){
                    NSLog(@"cb2: %@",msg);
                 }) copy]
];

ここで、互換性のある署名を持つ別のメソッドがあるとします。たとえば、次のようになります。

-(void)subscribeHandler:(NSDictionary*)msg{
    NSLog(@"cb2: %@",msg);
}

上記の subToPub メソッドへのコールバックとしてこれを渡すことは可能ですか、またはこのメソッド呼び出しをブロックでラップする必要がありますか?

4

3 に答える 3

6

説明したセレクターを呼び出すには、論理的に 3 つの情報が必要です。オブジェクト インスタンス、セレクターの名前、およびディクショナリ パラメーター。

渡されたブロックは、呼び出されたときに 1 つの情報 (辞書) のみを受け入れます。それ以外はすべてブロック内にキャプチャする必要があります。

したがって、論理的には、セレクターはブロックの単純な代替にはなりません。他の何よりも、それを呼び出すインスタンスの知識はどこから来るのでしょうか?

「この特定のオブジェクトのこのメソッド」のレコードを生成し、それを単一のオブジェクトに圧縮する唯一の方法は、それをブロックに入れることです。

呼び出したいメソッドのフォーマットが定義されていて (この場合は引数が 1 つのメソッド)、オブジェクトが暗黙的にわかっている場合は、セレクター ( SEL) を渡すことを検討してください。だから例えば

[myObj  subToPub:@"someId" 
       channelId:@"someOtherId" 
        callback:@selector(subscribeHandler:)
];

...そしてその後、話したいオブジェクトを知っていて、受け取ったオブジェクトを次objのように保存したと仮定します。SELselector

[obj performSelector:selector withObject:msg];

複数の引数を渡したい場合は、NSInvocations;でだまされ始める必要があります。これは非常に見苦しいものであり、言語にクロージャが追加された理由がすぐに理解できるようになるでしょう。

于 2013-01-25T01:14:42.940 に答える
2

あなたはこれを行うことができます

[myObj  subToPub:@"someId" 
       channelId:@"someOtherId" 
        callback:[(^(NSDictionary* msg){
                    [object subscribeHandler:msg];
                 }) copy]
];
于 2013-01-25T00:40:43.903 に答える
1

あなたはそれを包む必要があります。明らかに、その方法を知っています。たとえば、^(void)subscribeHandler:@ [@ "key":@"value"]。

于 2013-01-25T00:40:01.173 に答える