1

たとえば、次のようなメソッドがあります

[self performSelectorOnMainThread:@selector(someMethod) 
                       withObject:data
                    waitUntilDone:YES];

「someMethod」は別のクラスのものです。可能であれば、どうすればそれを行うことができますか? また、パラメータを渡す方法を知りたいです。

someMethod が次のように定義されているとします。

- (void)someMethod:(NSData *)data otherArg:(NSString *)arg;
4

5 に答える 5

3

selfメソッドを定義するクラスのインスタンスに置き換える必要があります。そうしないと、認識できないセレクタ エラーが発生します。また、引数を送信する場合は、コロン ( :) を後に置くことを忘れないでください。someMethod

于 2012-06-18T05:29:54.750 に答える
3

はい、別のクラスのセレクターを呼び出すこともできます。

セレクターがクラスメソッドの場合 -

[ClassName performSelectorOnMainThread:@selector(someMethod:) 
                   withObject:data
                waitUntilDone:YES];

メソッドシグネチャは次のようなものです-

+ (void)someMethod:(returntype)somearg

セレクターがインスタンスメソッドの場合 -

[classInstance performSelectorOnMainThread:@selector(someMethod:) 
                   withObject:data
                waitUntilDone:YES];

メソッドシグネチャは次のようなものです-

- (void)someMethod:(returntype)somearg
于 2012-06-18T05:31:01.717 に答える
1

場合によります。「self」が を実装するクラスから継承する場合someMethod、もちろんそれを行うことができます。ただし、そのクラス (または祖先クラス) がそのメソッドを実装していないオブジェクトにメッセージを送信することはできません。(まあ、できますが、エラーが発生することが予想されます。)

表示するコード スニペットは次のようになります。

[self someMethod:data];

ただし、someMethod:現在実行中のスレッドではなく、メイン スレッドで実行されます。selfそのように見ると、受信者 (この場合は任意のオブジェクトへのポインターである可能性があります) が、送信しているメッセージを実装する必要があることを思い出すのに役立ちます。

于 2012-06-18T05:35:48.487 に答える
0

self の代わりに、セレクターを実行したいクラスのインスタンスに置き換えます。

于 2012-06-18T05:30:02.093 に答える
0

performSelectorOnMainThread:...送信するメッセージは 2 つのパラメーターを受け取りますが、メッセージで 2 つのパラメーターを渡すバリアントはありません。

これを行う最も簡単な方法は、Grand Central Dispatch とブロックを使用することです。メインスレッドでこれを実行しないことが確実な場合は、次のように実行できます。

dispatch_sync(dispatch_get_main_queue(), ^{
    [otherObject someMethod:myData otherArg:@"my argument"];
});

しかし、既にメイン スレッドにいるときにそのコードを実行すると、そのコードはデッドロックし、アプリがハングします。

すでにメインスレッドにいるときにそれを実行したい場合は、デッドロックを避けるためにもっと注意する必要があります。私は次のようにします:

dispatch_block_t block = ^{
    [otherObject someMethod:myData otherArg:@"my argument"];
};

if (dispatch_get_current_queue() == dispatch_get_main_queue()) {
    block();
} else {
    dispatch_sync(dispatch_get_main_queue(), block);
}
于 2012-06-18T06:02:31.457 に答える