SwiftUI 在滚动列表期间停止更新

标签 swiftui combine

给定 SwiftUI 中的列表,一旦开始平移,列表中 View 的更新似乎会暂停,直到滚动停止。有没有办法防止这种情况?

考虑以下代码:

class Model: ObservableObject, Identifiable {
    @Published var offset: CGFloat = 0

    let id = UUID()
    private var timer: Timer!

    init() {
        timer = Timer.scheduledTimer(withTimeInterval: 0.5, repeats: true, block: { _ in
            self.update()
        })
    }

    func update() {
        offset = CGFloat.random(in: 0...300)
    }
}

struct ContentView: View {
    @ObservedObject var model1 = Model()
    @ObservedObject var model2 = Model()
    @ObservedObject var model3 = Model()
    @ObservedObject var model4 = Model()

    var body: some View {
        List {
            ForEach([model1, model2, model3, model4]) {
                Rectangle()
                    .foregroundColor(.red)
                    .frame(width: $0.offset, height: 30, alignment: .center)
                    .animation(.default)
            }
        }
    }
}

将导致这种行为:

Video of result

最佳答案

这是由于 Timer 的性质所致和 RunLoop .使用 GCD 代替,如下面的方法

demo

init() {
    var runner: (() -> ())?
    runner = {
        DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) { [weak self] in
            if let self = self {
                self.update()
                runner?()
            }
        }
    }
    runner?()
}

关于SwiftUI 在滚动列表期间停止更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60988047/

相关文章:

swift - 如何模拟DataTaskPublisher?

Swift Combine .debounce 内存泄漏?

swift - iOS1 3's Combine streams don' t 运算符(operator)使用调度程序后的流程

ios - 在 SwiftUI 中推送新 View 时隐藏 TabBar

realm - 如何在 SwiftUI 中使用 Realm

ios - 快速组合 : prepend() before share() prevents initial sink execution

ios - Swift Combine compactMap 不起作用(Xcode 13)

ios - 将 TextEditor 文本计数连接到 SwiftUI 中的 ProgressView

swiftui - 在 SwiftUI Mac 应用程序列表中删除右键单击行的轮廓

ios - 当在 View 中注入(inject)实体时,SwiftUI 预览版无法使用核心数据