swift - 在主线程上使用 @Published 值?
问题描述
有没有办法指定 count 应该只在主线程上发布?我看过有关使用 Publisher 设置您的文档的文档receive(on:)
,但在这种情况下,@Publisher
包装器隐藏了该逻辑。
import SwiftUI
import Combine
class MyCounter: ObservableObject {
@Published var count = 0
public static let shared = MyCounter()
private init() { }
}
struct ContentView: View {
@ObservedObject var state = MyCounter.shared
var body: some View {
return VStack {
Text("Current count: \(state.count)")
Button(action: increment) {
HStack(alignment: .center) {
Text("Increment")
.foregroundColor(Color.white)
.bold()
}
}
}
}
private func increment() {
NetworkUtils.count()
}
}
public class NetworkUtils {
public static func count() {
guard let url = URL.parse("https://www.example.com/counter") else {
return
}
var request = URLRequest(url: url)
request.httpMethod = "GET"
let task = URLSession.shared.dataTask(with: request) { data, response, error in
if let response = response as? HTTPURLResponse {
let statusCode = response.statusCode
if statusCode >= 200 && statusCode < 300 {
do {
guard let responseData = data else {
return
}
guard let json = try JSONSerialization.jsonObject(with: responseData, options: []) as? [String: Any] else {
return
}
if let newCount = json["new_count"] as? Int{
MyCounter.shared.count = newCount
}
} catch {
print("Caught error")
}
}
}
}
task.resume()
}
}
从我更新的示例中可以看出,这是一个简单的 SwiftUI 视图,它有一个按钮,单击该按钮会进行网络调用。网络调用是异步的。当网络调用返回时,在ObservableObject MyCounter
后台线程上更新。我想知道是否有办法ObservableObject
在主线程上发布更改。我现在知道的唯一方法是将更新逻辑包装在网络调用闭包中,如下所示:
DispatchQueue.main.async {
MyCounter.shared.count = newCount
}
解决方案
推荐阅读
- php - 填充
- javascript - 无法写入 Firebase,没有错误
- php - 带有 ssl、代理配置和 php7.1 的 ngnix 上的 502 Bad Gateway
- android - Android Studio 在构建过程中找不到可绘制对象
- java - Java-8:在文件的 1 行中多次匹配 1 个模式(通过过滤器)
- ios - 设置图像属性时,UIImageView 图像不会明显更新
- python - 使用 rrule 将日期分配给相关月份
- c++ - Opengl:如何正确映射缓冲区?
- javascript - 异步递归在用于轮询 fn 的 Js 代码中是否安全
- java - 如何获取节点的字符串值?