Обертывание асинхронных вызовов в синхронный блокирующий поток?

Я пишу модуль iOS, который в настоящее время отправляет электронное письмо асинхронно (с использованием делегатов). Он использует SKPSMTPMessage , который отлично работает. Моя проблема в том, что клиент хочет, чтобы код полностью блокировал поток до тех пор, пока электронное письмо не будет отправлено (или не будет отправлено). Таким образом, они в основном просят синхронное решение, когда в настоящее время оно попытается отправить электронное письмо, а затем вернется из этого блока кода до того, как электронное письмо будет отправлено.

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

Я пробовал несколько разных методов, используя NSOperation s и NSThread , но, возможно, я что-то делаю неправильно, потому что каждый раз, когда я пытаюсь заблокировать основной поток, асинхронный делегат вызовы по-прежнему, кажется, никогда не заканчиваются (они возвращаются в основной поток или что-то в этом роде?).

Любая информация или даже другие идеи приветствуются.

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

РЕДАКТИРОВАТЬ: Спасибо за вклад. Как было предложено в одном из ответов, я закончил тем, что просто использовал цикл while, который ждал, пока делегаты вернутся, но позволял runLoop продолжаться, например, так:

while( ![messageDelegate hasFinishedOrFailed] ){
    // Allow the run loop to do some processing of the stream
    [[NSRunLoop currentRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:1]];
}

10
задан valheru 21 December 2011 в 18:43
поделиться