【问题标题】:SwiftUI Preview crash with await async iOS15 if returns a struct with UUID如果返回带有 UUID 的结构,则 SwiftUI Preview 会因等待异步 iOS15 而崩溃
【发布时间】:2022-07-16 05:01:13
【问题描述】:

我简化为非常简单的代码。 如果结构有一个Int 正在工作,如果有一个UUID,则预览会崩溃(如果我在模拟器或真实设备上运行,它会工作)

经过测试 iOS 15 Xcode 13.1 和 beta 13.2

import SwiftUI
import Combine

struct MyStruct: Codable, Hashable, Identifiable {
    var id: UUID = UUID() //with Int is ok
    var str: String
}

struct ContentView2: View {
    
    @State private var myStruct: MyStruct = MyStruct(str: "struct1-init")
    
    var body: some View {
        VStack {
            Text(myStruct.str)
                .onAppear(perform: doSometingStruct)
        }
    }
    
    private func doSometingStruct() {
        Task {
            let get = await getAsyncStruct()
            myStruct = get
        }
    }
    
    private func getAsyncStruct() async -> MyStruct {
        let str = MyStruct(str: "struct1-done")
        return str
    }
}

struct ContentView2_Previews: PreviewProvider {
    static var previews: some View {
        ContentView2()
    }
}

【问题讨论】:

  • var id: String = UUID().uuidString 使用这个
  • @ChanOnly123 谢谢,但我认为为了防止预览崩溃而更改我的所有代码并不是一个好主意
  • 预览崩溃给你什么错误信息?我在 iOS 15 上的预览中使用 UUID() 没有问题。
  • 我遇到了同样的问题,但甚至没有 UUID,只是一个由多个其他结构组成的结构。当我将 async 关键字添加到函数时会发生这种情况,但是一个类似的函数也可以使用 async 返回一个字符串。回溯中的错误是await resume partial function for closure #2

标签: ios swift iphone swiftui ios15


【解决方案1】:

使用异步代码预览视图似乎是 xcode 的错误...尝试使用注释任务进行测试:

private func doSometingStruct() {
        //Task {
        //    let get = await getAsyncStruct()
        //    myStruct = get
        //}
    }

【讨论】:

    【解决方案2】:

    感觉不“正确”,但能够通过不让异步函数返回任何内容并将结构存储在可以从调用函数获取的全局变量中来解决这个问题。感觉各种错误,但它确实可以修复崩溃。如果有人有更好的解决方案,我很想知道!

    【讨论】:

      猜你喜欢
      • 2022-01-02
      • 1970-01-01
      • 2020-02-10
      • 2019-10-20
      • 1970-01-01
      • 1970-01-01
      • 2020-12-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多