は私が起動する必要があります。はperformSelectorOnMainThreadのためのオブジェクトとしてint型を渡す:
[self performSelectorOnMainThread:@selector(chooseURL:) withObject:myIndex waitUntilDone:YES];
しかし、私の問題はmyIndex
がint
で、ませ対象ということです。そのための回避策はありますか?
は私が起動する必要があります。はperformSelectorOnMainThreadのためのオブジェクトとして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];
のNSNumberオブジェクトとして分類することができるように[のNSNumberのnumberwithintを:myindex]:メインキューが常にオンである
dispatch_sync(dispatch_get_main_queue(), ^{
[self chooseURL:myIndex];
});
をperformSelectorOnMainThread:...
のGCDのバージョンを使用してアンラップする メインスレッド
すでにメインスレッドにいる間に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()
を使用することができます。必要に応じて確認してください。
あなたの答えは素晴らしく、私はそれから多くを学んだ!そして、それは完全に動作します! – Winston
素晴らしい!反対方向に行く方法はありますか?NSNumberをintに再度変換しますか? – Winston
@ウィンストン:スティーブはすでにあなたに言った。彼の答えの最後の行です。 –
ああ、そうです!私の悪い!ごめんなさい! – Winston