![](/img/trans.png)
[英]Do I need an autoreleasepool block inside a 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.