繁体   English   中英

我是否仍然需要使用 DispatchQueue.main.async 包装已发布的属性包装器对象更新

[英]Do I still need to wrap Published Property wrapper object update with DispatchQueue.main.async

我的代码如下

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 内部处理的

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

但是,如果您将 observable 对象包装为MainActor (自 iOS 15 起可用!!),如下所示,那么您不需要这样的重定向并且可以进行直接分配 - main actor 包装器会做其他事情。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM