12

ブロック内で dispatch_async() を呼び出すと、@synchronized() を使用して IOS のロックはどうなりますか。

例:

    id myID
-(void) foobar
{
    @synchronized(myID){
        dispatch_async(){ //do stuff with myID};
    }
}

dispatch_async 呼び出し内でロックはまだ有効ですか? または、さらに重要なことに、dispatch_async() 内で別の @synchronized() 呼び出しを使用することに欠点はありますか?

4

2 に答える 2

4

そこのロックは、2 つの異なるブロックが同時にディスパッチされるのを防ぐだけです。ただし、それらは非同期でディスパッチされるため、その時点で実行されるか、または将来的に任意に実行される可能性があります。ディスパッチ呼び出しも、それらが完了するのを待ちません。

したがって、ブロック内のものは同期されません。最小限の変更でそれを達成するためのオプションは、同期ディスパッチまたはブロック内の @synchronizing です。

何をしているかにもよりますが、シリアル ディスパッチ キューを確立し、その上にブロックをディスパッチするのが最善の方法かもしれません。

于 2013-09-04T22:57:41.463 に答える