在Objective-c中,如何确保在另一个代码之后调用一个代码?

时间:2013-05-14 02:52:30

标签: objective-c multithreading

我不是指同步和东西。实际上,这不是一般良好的编程实践。我只是认为应该做点什么。

例如,假设我有一个线程可以自行暂停并等到事件发生。事件通常发生在该线程暂停之前。

所以我希望事件等到线程在它发生之前暂停。

我该怎么做?

例如,假设我想在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");
    }];
}

2 个答案:

答案 0 :(得分:2)

您所描述的是许多事件传递系统中出现的众所周知的竞争条件,解决方案取决于系统编程接口的细节。

例如,检测Unix信号很容易出现这种竞争条件,并且有许多解决方案(具有不同的可移植性)。请参阅“Handling Signals” on the Event Loop Wikipedia page了解其中几个。

因此,您的问题的答案完全取决于您要检测的事件以及可用于检测它们的编程接口。如果您想要更具体的答案,则需要编辑帖子以包含这些详细信息。

答案 1 :(得分:2)

通常最好避免轮询,等待,长期或无限期的线程或资源阻塞。不过......您可以等待使用条件变量dispatch_group_wait-[NSOperationQueue waitUntilAllOperationsAreFinished]