2013-02-23 3 views
1

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

- (void)didReceiveNetworkMessage { 
    [obj respondToMethod]; 
} 

- (void)myBigMethod { 
    [obj mySmallMethod1]; 
    [obj mySmallMethod2]; 
    /* network message received now */ 
    [obj mySmallMethod3]; 
    [obj mySmallMethod4]; 
} 

В каком порядке методы называются по obj выполняются в однопоточных среде?

+0

Являются ли myBigMethod и didReceiveNetworkMessage вызываемыми в той же теме? –

ответ

2

Предполагая, что все вышеперечисленное находится в главной теме, myBigMethod завершит выполнение (так будет вызываться mySmallMethod4) до обработки метода didReceiveNetworkMessage.

Обратный вызов обычно выполняется в основном потоке, поскольку он выполняется после выполнения фоновой работы (то есть сетевой загрузки). Если вы специально не закодировали его в противном случае, все будет происходить в основном потоке.

-1

Это зависит от того, как все вставляется в кучу стека. Лучше всего было бы смотреть, как вы стек (распечатывать сообщения) и тому подобное, чтобы понять это. Куча определяет порядок выполнения. Если есть проблема с задержкой, манипулирование порядком кучи, вероятно, исправит его для вас. Если вам нужно что-то выполнить в одно и то же время, многопоточность и бросок в блочном коде должны помочь.

- (void)didReceiveNetworkMessage { 
    [obj respondToMethod]; 
} 

- (void)myBigMethod { 
    [obj mySmallMethod1]; 
    [obj mySmallMethod2]; 
    /* network message received now */ 
    [obj mySmallMethod3]; 
    [obj mySmallMethod4]; 
} 

Из приведенной выше коды с отмеченной ссылкой кажется, как respondToMethod, mySmallMethod1,2,3,4 называются в таком порядке.

Я предполагаю, что я должен уточнить, что с полным отсутствием информации, приведенной выше (включая сообщения, которые на самом деле называют эти методы и где). Без этой информации мой ответ будет правильным. Не знаю, почему я за это проголосовал. Я изложил порядок, в котором методы вызываются и выполняются с предположением, что вы получаете обратный вызов от метода ответа до метода mySmallMethod3 и после mySmallMethod2. Это то, что было указано в приведенном выше примере. Если вы хотите получить лучший ответ, укажите более подробный пример.

1

Update: Учитывая обновленный вопрос, а затем, если все будет сделано в том же потоке, то respondToMethod будет называться после того, как myBigMethod делается.

Если несколько потоков были вовлечены тогда предполагая didReceiveNetworkMessage называется в другом потоке, чем метод myBigMethod, вы увидите:

mySmallMethod1 
mySmallMethod2 
mySmallMethod3 
mySmallMethod4 

и respondToMethod можно вызвать в любое время mySmallMethod2 будет начать выполняться или позже ,

Другими словами, respondToMethod могут работать одновременно, как mySmallMethod2, mySmallMethod3 или mySmallMethod4 или даже после того, как mySmallMethod4 делается.

+0

Мне нравится, как мы открылись с «предположением ...», но сделали разные предположения! – jrturton

+1

@jrturton Было только два предположения. Каждый из нас взял. Хотя теперь я охватываю оба. :) – rmaddy

0

Методы, которые не находятся в одном потоке, в той же очереди или в очереди, ориентированной на одну и ту же очередь, имеют неопределенный порядок относительно друг друга. Индивидуальные инструкции каждого могут возникать в любое время в течение другого, включая одновременно.

Если методы выполняются в таком сериализованном контексте, то порядок зависит от того, какой из них был запущен первым; то же самое относится и к запуску метода, так что порядок также не определен.

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