#ios #swift
Вопрос:
Я новичок в swift и использую приложение с открытым исходным кодом, которое требует отправки электронного письма при нажатии на запись. Я тоже получаю эти два предупреждения. Я прикрепил снимок экрана.
Спасибо
func sendEmail(dateString: String, path: URL, hr_path: URL) {
let composeVC = MFMailComposeViewController()
composeVC.mailComposeDelegate = self
composeVC.navigationBar.tintColor = .white
composeVC.navigationBar.titleTextAttributes = [NSAttributedString.Key.foregroundColor: UIColor.white]
// Configure email
// composeVC.setToRecipients(["your@email.here"])
composeVC.setSubject("Sleep event data for " dateString)
composeVC.setMessageBody("Sleep event data attached as CSV", isHTML: false)
if let fileData = NSData(contentsOf: path) {
print("Motion data loaded.")
composeVC.addAttachmentData(fileData as Data, mimeType: "text/csv", fileName: "motion_data.csv")
}
if let fileData = NSData(contentsOf: hr_path) {
print("HR data loaded.")
composeVC.addAttachmentData(fileData as Data, mimeType: "text/csv", fileName: "hr_data.csv")
}
// Present mail controller
self.present(composeVC, animated: true, completion: nil)
}
func mailComposeController(_ controller: MFMailComposeViewController,
didFinishWith result: MFMailComposeResult, error: Error?) {
controller.dismiss(animated: true, completion: nil)
}
Ответ №1:
Как вы называете отправку почты ? Это именно та ошибка, о которой написано в сс. Предупреждение о главном потоке :). Вы должны вызвать функцию отправки почты в главном потоке, как показано ниже.
DispatchQueue.main.async { [weak self] in
self?.sendEmail(dateString: "sample", path: "URL", hr_path: "URL")
}
Ответ №2:
Возможно, ваша sendEmail()
функция была вызвана в каком-то фоновом потоке.
Всякий раз, когда вы хотите инициализировать контроллер представления или вообще что-то сделать с пользовательским интерфейсом, пожалуйста, делайте это в главном потоке.
Итак, в этом случае, поскольку инициализация контроллера представления находится внутри sendEmail()
, вам нужно вызвать sendEmail()
основной поток, например:
DispatchQueue.main.async { [weak self] in
guard let `self` = self else { return }
self.sendEmail(dateString: "7/7/2021", path: "myPath", hr_path: "hrPath")
}