私は呼び出す必要があります:
[self performSelectorOnMainThread:@selector(chooseURL:) withObject:myIndex waitUntilDone:YES];
しかし、私の問題は、それmyIndex
が でありint
、オブジェクトではないことです。そのための回避策はありますか?
私は呼び出す必要があります:
[self performSelectorOnMainThread:@selector(chooseURL:) withObject:myIndex waitUntilDone:YES];
しかし、私の問題は、それmyIndex
が でありint
、オブジェクトではないことです。そのための回避策はありますか?
int はオブジェクトではなくプリミティブ型であるため、int をオブジェクトにラップする必要があります。例えば:
[self performSelectorOnMainThread:@selector(chooseURL:)
withObject:[NSNumber numberWithInt:myIndex]
waitUntilDone:YES];
もちろん、int の代わりに NSNumber を受け入れるように chooseURL: メソッドを編集する必要があります。アンラップするには:
int myInt = [myIndex intValue];
int から NSNumber を作成します
[NSNumber numberWithInt:myInt];
の 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()
NSNumber はオブジェクトとして分類できるため、[NSNumber numberwithint:myindex] を使用します。