私は同期などを意味するものではありません。これは、実際には一般的に良いプログラミング手法ではありません。ただ、やるべきことがあると思います。
たとえば、自分でサスペンドし、イベントが発生するまで待機するスレッドがあるとします。多くの場合、そのスレッドが中断する前にイベントが発生します。
そのため、イベントが発生する前に、スレッドが一時停止するまでイベントを待機させたいと考えています。
それ、どうやったら出来るの?
たとえば、mainQueue で 5 つのことをしたいとします。
何かをしてください。終わるまで待って、次へ。
私はこれを行います:
-(void) vDoSomeStuffsInSequence:(NSArray *) arblArrayOfBlocksToExecuteOnMainThread
{
if (self.blockThis) {
PO(@"Cancel Push View Controller");
return;
}
@synchronized(self)
{
self.blockThis=true;
}
AssertMainThread
NSMutableArray * arblNotFirstBlocks = [arblArrayOfBlocksToExecuteOnMainThread mutableCopy];
void(^blockToExecute)() = arblNotFirstBlocks[0];//execute first block right away
blockToExecute();
PO(@"execute pop push etc");
[arblNotFirstBlocks removeObjectAtIndex:0];
[[NSOperationQueue new] addOperationWithBlock:^{
PO(@"before first suspend");
[self vSuspendAndHaltThisThreadTillUnsuspended]; //This often happen after (instead of before) the code that execute [self vContinue is called]
PO(@"after first suspend");
for (void(^blockToExecute)() in arblNotFirstBlocks) {
while(false);
[[NSOperationQueue mainQueue] addOperationWithBlock:^{
blockToExecute();//dothisfirst must unsuspend a thread somewhere
}];
[self vSuspendAndHaltThisThreadTillUnsuspended];
}
[[NSOperationQueue mainQueue]addOperationWithBlock:^{
@synchronized(self)
{
self.blockThis=false;
}
[self vContinue];
}];
[self vSuspendAndHaltThisThreadTillUnsuspended];
PO(@"finish vDoSomeStuffsInSequence");
}];
}