我正在使用 Swift 和 SwiftUI 构建一个应用程序。在 MainViewModel 中,我有一个函数调用 Api 从 url 获取 JSON 并将其反序列化。这是在 async/await 协议下进行的。问题是下一个,我从 xcode 收到了下一条评论:“不允许从后台线程发布更改;确保在模型更新时从主线程发布值(通过像 receive(on:) 这样的运算符)。” 在这部分代码中:
func getCountries() async throws{
countries = try await MainViewModel.countriesApi.fetchCountries() ?? []
}
Run Code Online (Sandbox Code Playgroud)
谁称这个为:
func fetchCountries() async throws -> [Country]? {
guard let url = URL(string: CountryUrl.countriesJSON.rawValue ) else {
print("Invalid URL")
return nil
}
let urlRequest = URLRequest(url: url)
do {
let (json, _) = try await URLSession.shared.data(for: urlRequest)
if let decodedResponse = try? JSONDecoder().decode([Country].self, from: json) {
debugPrint("return decodeResponse") …Run Code Online (Sandbox Code Playgroud) 我正在尝试开发一个用户必须输入他的姓名的视图。这两个文本字段有一个 FocusState。一切都很顺利,当焦点改变他的目标时,就不会出现一点反弹。

我不知道我的代码中针对此问题发生了什么。这是我的代码:
struct OnboardingViewPart2: View {
enum Field: Hashable{
case name
case surname
}
@State var displayName = ""
@State var showImagePicker = false
@State var isSomePhotoSelected = false
@State var displaySurname = ""
@FocusState var focusedField : Field?
// For image picker
@State var imageSelected: UIImage = UIImage(systemName: "person.fill")!
@State var sourceType: UIImagePickerController.SourceType = .photoLibrary
var body: some View {
VStack(alignment: .center, spacing: 20, content: {
Run Code Online (Sandbox Code Playgroud)
//其他代码
// MARK: Textfield group
Group{
TextField("Add your name here...", text: $displayName) …Run Code Online (Sandbox Code Playgroud)