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