14

の一般的な呼び出しはperformSelectorOnMainThread:次のようになります。

[target performSelectorOnMainThread:action withObject:foo waitUntilDone:NO];

ここで、「result」は「action」に渡される引数です。対応するアクションは次のようになります。

- (void)doSomethingWithThing1:(id *)thing1

> 1引数を取るアクションを呼び出すための正しい構文は何ですか?そのような:

- (void)doSomethingWithThing1:(id *)thing1 andThing2(id *)thing2 andAlsoThing3(id *)thing3

[target performSelectorOnMainThread:action withObject:??? waitUntilDone:NO];
4

3 に答える 3

15

あなたはあなたの引数を辞書または配列に入れてそれを特別な関数に渡すことによってそれをすることができます

- (void)doStuff:(NSString *)arg1 and:(NSString *)arg2 and:(NSString *)arg3 {
...
}

- (void)doStuff:(NSArray *)argArray {
    [self doStuff:[argArray objectAtIndex:0]
              and:[argArray objectAtIndex:1]
              and:[argArray objectAtIndex:2];
}
于 2009-09-22T15:02:12.820 に答える
8

のメソッドに非オブジェクトを渡すことに関する同様の質問に答えて、NSObjectのDave DribinのカテゴリperformSelectorOnMainThread:を指摘しました。これにより、次のようなことができます。

[[person dd_invokeOnMainThread] doSomethingWithThing1:thing1 andThing2:thing2 andAlsoThing3:thing3];

メインスレッドでマルチ引数メソッドを実行するため。これはかなりエレガントなソリューションだと思います。舞台裏では、彼はNSInvocationで物事をラップし、メインスレッドでそれを呼び出します。

Amberフレームワークも、これと同様のことを行います。

于 2009-09-22T16:50:05.677 に答える
1

レシーバーのメソッドシグネチャを保持したい場合は、NSInvocation複数の引数値を指定できるを使用することを検討する必要があると思います。

別の回答で提案されているように、呼び出しをラップして引数のコンテナーとして辞書を使用することもできますが、私にはこれはコードの臭いのように思えます。

この方針に沿ったより良い解決策は、引数値をカプセル化するクラスを作成することです。つまり、強く型付けされたアプローチです。したがって、たとえば、を渡す代わりにfirstname、クラスsurnameのインスタンスを渡します。Person引数が少ないメソッドはよりクリーンなコードを生成できるため、これはおそらくダウンするためのより良いルートです-しかし、それはまったく別の話です。

于 2009-09-22T15:01:24.930 に答える