Вы можете использовать семафор, но - в общем - синхронизация асинхронной операции - это красный флаг, указывающий на плохой дизайн.
Являются ли два блока асинхронными сами по себе?Если это так, вы могли бы иметь __block BOOL firstDone = NO;
и __block BOOL secondDone = NO;
и соответственно проверить, настало ли время для вызова блока завершения.Все еще безобразно, и вам понадобится примитив синхронизации, чтобы убедиться, что вы не участвуете в гонке, но это бы сработало.
Если firstBlock()
и secondBlock()
синхронны и находятся в одной очереди,затем просто позвоните completionBlock()
после завершения второго.
Или, в качестве альтернативы, если они асинхронные и одновременно запланированы, бросьте их в асинхронную очередь, а затем бросьте барьерный блок в очередь, которая вызывает completionBlock
.