Хорошо, внезапно я получаю предупреждения (и ошибки во время выполнения) в коде, который не менялся уже довольно давно. Я считаю, что это связано с параллелизмом Swift.
Более подробная информация ниже. Вся помощь очень ценна. О том, где искать дальше.
Использование примера кода от Apple также демонстрирует эту проблему.
Я получаю ошибки при использовании новых переменных среды для открытия существующего документа: Ссылка для разработчиков Apple
Я получаю эту ошибку, когда у меня есть представление SwiftUI как @MainActor:
Я получаю эту ошибку без него:
Я получаю это, если задаю задачу для главного актера.
Сбой во время выполнения:
И вывод консоли при сбое во время выполнения:
Спасибо, я посмотрел многие из них, но вернусь к ним еще раз. Я попытался добавить @MainActor в представление, но безуспешно.
Нам нужен MRE, чтобы хотя бы отладить это, придумать небольшой образец и отметить меня. async/await имеет строгие правила, которые необходимо соблюдать. Swift6 будет раскачивать лодку во многих проектах, не расстраивайтесь.
@loremipsum — новый проект с кодом отсюда демонстрирует ту же проблему в моей системе. Developer.apple.com/documentation/swiftui/environmentvalues/…





В SwiftUI это .task, а не Task. В вашем случае, вероятно, что-то вроде:
.onGesture {
count += 1
}
.task(id: count) {
}
Спасибо, Малхал, я использую Task в другом месте своего приложения и в сценарии кнопки, но все равно получаю вышеуказанную ошибку. Я начинаю думать, что это только я/что-то специфичное для моей системы.
Просто используйте .task, он оборачивает задачу и отменяет ее, что вы, вероятно, забыли сделать.
Ответ заключался в том, чтобы сделать то, что предложил Lorem ipsum, сделать родительское представление @MainActor, но также вытащить код из тела представления в свой собственный метод и вызвать этот асинхронный метод из вызова Task внутри тела представления.
В моем коде я объявляю переменную Environment внутри представления, как и раньше, но перенес вызов ее в функцию внутри представления:
@MainActor struct ExistingProjectButton: View {
@Environment(\.openDocument) private var openDocument
var body: some View {
...
.simultaneousGesture(TapGesture(count: 2).onEnded {
Task{
await openExistingDocument(url: buttonURL)
}
}
func openExistingDocument(url: URL) async{
do {
try await openDocument(at: url)
} catch {
// Handle error
print("Error opening: \(error.localizedDescription)")
}
}
}
Вам следует посмотреть все новые видеоролики об async/await. Но добавление MainActor в представление, скорее всего, решит эту проблему.