Я пишу модуль iOS, который в настоящее время отправляет электронное письмо асинхронно (используя делегатов). Он использует SKPSMTPMessage
, который отлично работает. Моя проблема заключается в том, что клиент хочет, чтобы код полностью блокировал поток до тех пор, пока сообщение не было отправлено (или не было отправлено). Поэтому они в основном запрашивают синхронное решение, когда в настоящее время он попытается отправить электронное письмо, а затем вернуться из этого блока кода до отправки сообщения электронной почты.
Поэтому вместо того, чтобы пытаться переписать код SKPSMTPMessage
синхронным способом (для него, похоже, не существует каких-либо синхронных параметров), я надеюсь найти способ переноса этого блока асинхронного кода в свой собственный нить и, возможно, сделать основной поток, ожидая его полного завершения (делегаты и все).
Я пробовал несколько разных методов с помощью NSOperation
и NSThread
, но, возможно, я не делаю что-то правильно, потому что каждый раз, когда я пытаюсь заблокировать основной поток, асинхронные вызовы делегатов все равно никогда не заканчиваются (они вернуться на главную нить или что-то еще?).
Любая информация или даже другие идеи оценены.
PS ~ Я понимаю, что это немного назад. В большинстве случаев асинхронность, по-видимому, является способом выхода, но это особый случай, и у клиента есть свои причины для его желания.
EDIT: Спасибо за все входные данные. Как было предложено одним из ответов, я закончил тем, что просто использовал цикл while, который ждал возвращения делегатов, но пусть runLoop будет продолжать так же:
while( ![messageDelegate hasFinishedOrFailed] ){
// Allow the run loop to do some processing of the stream
[[NSRunLoop currentRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:1]];
}