Я пишу модуль 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]];
}