2013-08-19 4 views
2

Я делаю некоторые настройки в прошивке, я подклассы системного класса, который выполняет метод асинхронно (предположительно с dispatch_async) Примера кодом:телефонный код последовательно после dispatch_async

-(void)originalAsyncMethod { 
    [super originalAsyncMethod]; 
    dispatch_async(dispatch_get_main_queue(), ^{ 
     //do something that needs to happen just after originalAsyncMethod finishes executing 
    }); 
    } 

Есть ли способ, которым я может ли убедиться, что мой пользовательский код работает ПОСЛЕ того, как выполняется метод async super?

+1

В общем, без доступа к источнику суперкласса вы не можете сделать это (по крайней мере, не надежно и надежно). Возможно, вы могли бы рассказать нам, что такое бизнес-проблема и что такое суперкласс, и мы могли бы предложить другие подходы. – Rob

+1

Я не знаю системного класса, который имеет асинхронный метод БЕЗ любых средств для завершения сигнала на сайт-вызов. Итак, в IFF есть блок завершения или метод делегата (я уверен, что есть) просто вызывают ваш метод после получения события завершения. Но если мы точно не знаем, что есть какой-то обработчик завершения, мы не можем предложить решение, и любой ответ будет просто бла-бла. Итак, я могу просто подчеркнуть, что @Rob уже сказал выше. – CouchDeveloper

ответ

2

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

Прежде всего, предполагая, что у вас есть доступ к суперклассу, и что супер-реализация также отправляет асинхронно в основную очередь, тогда вам фактически не нужно ничего делать, чтобы это нормально работало. Когда вы используете dispatch_get_main_queue(), вы добавляете свой блок отправки в конец последовательной очереди основного потока, который выполняется в порядке FIFO (первый в первом порядке).

Второй вариант также очень сильно зависит от доступа к супер-реализации, поскольку для выполнения задач вам потребуется вручную создать собственную очередь отправки. Я думаю, само собой разумеется, что если вы используете очередную диспетчерскую очередь, то у вас есть FIFO-порядок в этой очереди, такой же, как у вас dispatch_get_main_queue(), только вам не придется выполнять в основном потоке.

И последний вариант, о котором я могу думать, не обязательно потребует, чтобы вы модифицировали суперкласс, но потребовали бы, чтобы вы знали очередь, над которой выполнялся супер. (и все еще может не работать правильно, если это глобальная очередь). Используя диспетчер_бабринга, вы можете позволить своей суперреализации выполнить асинхронно в параллельной очереди, зная, что блок отправки подкласса также добавлен в очередь (через dispatch_barrier) и будет выполнен после завершения супер-отправки (и любых других предыдущих заявок в очередь).

Quoting the docs

Донесения барьер позволяет создать точку синхронизации в одновременную очереди отправки. Когда он сталкивается с барьером, одновременная очередь задерживает выполнение барьерного блока (или любых дополнительных блоков) до тех пор, пока все блоки, представленные перед завершением барьера . В этот момент барьерный блок выполняется сам по себе. По завершении очередь возобновляет свое обычное поведение.

+0

У меня нет доступа к реализации суперкласса, и я предполагаю, что он отправлен в основную очередь, потому что он изменяет иерархию пользовательского интерфейса (добавляет новый ключ UIWindow). Может ли третий вариант быть реализован без источника для супер-реализации? – nobre

+0

@nobre Очень жаль, что я не мог больше помочь, но это все, что я действительно знаю об этом. И просто что-то иметь в виду, но суперкласс может отправлять в очередь, отличную от основной очереди, а затем только возвращаться в основную очередь в конце выполнения, чтобы изменить пользовательский интерфейс. –

+2

Как говорит @ 0x7fffffff, вам нужно знать, что использует «originalAsyncMethod» в очереди. Без этой информации и вообще без информации о деталях внутренней реализации 'originalAsyncMethod' нет никакого общего способа узнать, когда какой-либо другой метод« сделан », если« сделано »включает асинхронную работу. Привязка к внутренней реализации деталей кода Apple очень хрупка и предполагает, что вы должны переориентироваться на свой дизайн. –