Я совершенно беспомощен прямо сейчас, я пытаюсь отправить электронное письмо для загрузки данных в приложении iOS Swift 4. Я нашел библиотеку Obj-C Mailcore, которая работает в обычном коде, например, в обратном вызове нажатия кнопки. Но если я пытаюсь использовать тот же код в моей функции AppDelegate
fetch, он не возвращается из завершенияHandler.
Операция отправки Mailcore является асинхронной, поэтому я использовал оболочку семафора вокруг нее, но обработчик завершения никогда не вызывается.
Изменить:
Видимо не работает код в кнопке с Семафором. Только если я удалю
let _ = semaphore.wait(timeout: DispatchTime.distantFuture)
часть.
Есть ли другой способ дождаться завершения асинхронного завершения блока?
Да, посмотри на мой ответ :-)
Мой код:
let smtpSession = MCOSMTPSession()
[...]
let sendOperation = smtpSession.sendOperation(with: rfc822Data!)
[...]
let semaphore = DispatchSemaphore(value: 0)
if (sendOperation != nil) {
print("Starting sendOperation...")
sendOperation?.start { (error) -> Void in
if (error != nil) {
sendingError = true
print("Error sending email: \(error)")
} else {
print("Successfully sent email!")
}
sendingDone = true
semaphore.signal()
}
let _ = semaphore.wait(timeout: DispatchTime.distantFuture)
} else {
print("Cant init sendOperation")
sendingError = true
}
sendOperation
не равен нулю при вызовеstart
? Нет ничего особенного в объекте, который принимаетUIApplicationDelegate
- person Warren Burton   schedule 23.11.2018sendOperation
выглядитOptional
из вашего кода. Вы можете видеть это изsendOperation?
, используя необязательную цепочку. - person Warren Burton   schedule 23.11.2018