web-dev-qa-db-ja.com

複数の引数を持つiOS performSelectorOnMainThread

メインスレッドで別のスレッドからセレクターを実行したいのですが、セレクターには次のような複数の引数があります。

-(void) doSomethingWith:(int) a b:(float)b c:(float)c d:(float)d e:(float)e { //... }

performSelectorOnMainThread: withObject: waitUntilDone:でこれを機能させるにはどうすればよいですか?

[〜#〜] edit [〜#〜]

これが必要な理由を説明したいと思います。

メインスレッドでUIImageViewsを使用しており、別のスレッドでUIImageViewsの計算を行っています。私は多くの計算を使用するので、メインスレッドですべてを作成すると、アプリが遅れます。 UI要素はメインスレッドでのみ操作できることを知っています。このため、この方法で動作させたいので、メインスレッドはタッチイベントを遅延なくリッスンできます。

41
McDermott

IOS> = 4を使用している場合は、代わりにこれを実行します。

dispatch_async(dispatch_get_main_queue(), ^{
    [self doSomething:1 b:2 c:3 d:4 e:5];
});

それはwaitUntilDone:NO。メソッドが終了するまで待ちたい場合は、dispatch_sync代わりに。

96
DarkDust

NSInvocation を使用する必要があります。

オブジェクトを作成し、ターゲット、セレクター、および引数を設定します。
次に、使用

[ invocationObject performSelectorOnMainThread: @selector( invoke ) withObject: nil, waitUntilDone: NO ];
6
Macmade

必要な引数を持つNSDictionary/NSArrayタイプのオブジェクトを1つ渡すことができます。

関数で同じタイプのオブジェクトを受け入れます。次に、値を分解して処理を続行します。

nSarray/NSDictionaryに数値を追加するために数値にNSNumberを使用する必要があり、後で関数でintValue/floatValueなどで元に戻すことができます。

最高のバック。

3