1

私は呼び出す必要があります:

[self performSelectorOnMainThread:@selector(chooseURL:) withObject:myIndex waitUntilDone:YES];

しかし、私の問題は、それmyIndexが でありint、オブジェクトではないことです。そのための回避策はありますか?

4

4 に答える 4

5

int はオブジェクトではなくプリミティブ型であるため、int をオブジェクトにラップする必要があります。例えば:

[self performSelectorOnMainThread:@selector(chooseURL:) 
                       withObject:[NSNumber numberWithInt:myIndex] 
                    waitUntilDone:YES];

もちろん、int の代わりに NSNumber を受け入れるように chooseURL: メソッドを編集する必要があります。アンラップするには:

int myInt = [myIndex intValue];
于 2012-04-27T18:32:07.083 に答える
2

int から NSNumber を作成します

[NSNumber numberWithInt:myInt];

于 2012-04-27T18:29:40.500 に答える
2

の GCD バージョンを使用しますperformSelectorOnMainThread:...

dispatch_sync(dispatch_get_main_queue(), ^{
    [self chooseURL:myIndex];
});

メイン キューは常にメイン スレッドにあります。

dispatch_sync()すでにメインスレッドにいる間は使用しないでください。そうしないと、デッドロックが発生します。必要に応じて確認してください。

dispatch_queue_t mainQ = dispatch_get_main_queue();
if( mainQ != dispatch_get_current_queue() ){
    dispatch_sync(mainQ, ^{
        [self chooseURL:myIndex];
    });
}
else {
    [self chooseURL:myIndex];
}

には、同じスレッドから使​​用しても問題ない を使用できwaitUntilDone:NOます。dispatch_async()

于 2012-04-27T18:35:53.940 に答える
1

NSNumber はオブジェクトとして分類できるため、[NSNumber numberwithint:myindex] を使用します。

于 2012-04-27T18:33:06.147 に答える