【问题标题】:Do I still need to wrap Published Property wrapper object update with DispatchQueue.main.async我还需要用 DispatchQueue.main.async 包装 Published Property 包装器对象更新吗
【发布时间】:2021-11-06 07:34:58
【问题描述】:

我的代码如下

class WebSocketManager: ObservableObject {
    @Published var messages: [String] = []

    private let socket: URLSessionWebSocketTask =
        URLSession(configuration: .default).webSocketTask(with: URL(string: "ws://localhost:8082")!)

    func receiveMessage() {
        socket.receive { result in
            switch result {
            case .failure(let error):
                print("Error Detected: \(error)")
            case .success(let message):
                switch message {
                case .string(let text):
                    DispatchQueue.main.async {
                        self.messages.append(text)
                    }
                default:
                    print("Received data different format data")
                }
                self.receiveMessage()
            }
        }
    }

我想知道是否还应该用DispatchQueue.main.async 包裹self.messages.append(text)

                case .string(let text):
                    DispatchQueue.main.async {
                        self.messages.append(text)
                    }

或者我不需要包装它

                case .string(let text):
                    self.messages.append(text)

因为它是由 SwiftUI 内部处理的

【问题讨论】:

    标签: ios swift swiftui


    【解决方案1】:

    不,它不是由 SwiftUI 内部处理的,如果代码与提供的一样,您应该明确重定向主队列中的更改。

    但是,如果您将 observable 对象包装为MainActor(自 iOS 15 起可用!!),如下所示,那么您不需要此类重定向并且可以直接分配 - 主要参与者包装器将执行其他操作。

    @MainActor                                // << here !!
    class WebSocketManager: ObservableObject {
        @Published var messages: [String] = []
    ...
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-11-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多