2013-05-14 3 views
-1

Я не имею в виду синхронизацию и прочее. На самом деле это не хорошая практика программирования. Я просто думаю, что нужно что-то сделать.В Objective-c, как я могу гарантировать, что один код вызывается после другого кода?

Например, скажите, что у меня есть нить, которая приостановит ее сам и дождитесь события. Часто событие происходит до того, как этот поток приостанавливается.

Поэтому я хочу, чтобы событие подождало, пока поток не приостановится до его появления.

Как это сделать?

Например, я хочу сделать 5 вещей на mainQueue.

Сделайте что-нибудь. Подождите, пока все будет готово, сделайте следующее.

Я делаю это, то:

-(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"); 
    }]; 
} 
+0

Похоже, вы хотите использовать грандиозную центральную отправку. Или, возможно, NSOperationQueues. Посмотрите здесь: http://www.fieryrobot.com/blog/2010/09/01/synchronization-using-grand-central-dispatch/ – slycrel

+0

Я нашел решение, которое работает. Я хочу ответить. –

ответ

2

Опрос, ожидание и длинная или неопределенная нить или блокировка ресурсов, как правило, лучше всего избегать. Тем не менее ... вы можете подождать, используя переменные состояния, dispatch_group_wait, или -[NSOperationQueue waitUntilAllOperationsAreFinished].

2

То, что вы описываете, это хорошо известно состояние гонки, которая возникает во многих системах событий доставки, и решение зависит от деталей интерфейса программирования системы.

Например, обнаружение сигнала Unix подвержено этому состоянию гонки, и существует ряд решений (различной мобильности). См. “Handling Signals” on the Event Loop Wikipedia page для пары из них.

Таким образом, ответ на ваш вопрос полностью зависит от событий, которые вы хотите обнаружить, и программных интерфейсов, доступных для их обнаружения. Вам нужно отредактировать сообщение, чтобы включить эти данные, если вы хотите получить более конкретный ответ.

Смежные вопросы