首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何正确地将NSColorPanel连接到服务器以避免过载

如何正确地将NSColorPanel连接到服务器以避免过载
EN

Stack Overflow用户
提问于 2020-01-09 23:40:10
回答 1查看 159关注 0票数 2

我正在使用NSColorPanel更改视图的颜色。此视图的颜色也保存在数据库中(Firestore)。

代码语言:javascript
复制
import AppKit

class ColorPanel {

    static var shared = ColorPanel()

    private var stage: DB.Stage.Document? = nil

    private let cp = NSColorPanel.shared

    init() {
        cp.setTarget(self)
        cp.setAction(#selector(colorDidChange(sender:)))
        cp.isContinuous = false
    }

    func show(stage: DB.Stage.Document) {
        self.stage = stage
        cp.makeKeyAndOrderFront(nil)
    }

    @objc func colorDidChange(sender: NSColorPanel) {
        guard let stage = stage else { return }
        stage.data?.color.red = Double(sender.color.redComponent)
        stage.data?.color.green = Double(sender.color.greenComponent)
        stage.data?.color.blue = Double(sender.color.blueComponent)
        stage.update()
    }
}

问题是,我希望将isContinuos设置为true,以便看到我的视图实时更改颜色,但向服务器发送了太多更新,因此我被迫将其设置为false。

有办法解决这个问题吗?我只需要做一个更新,当我完成拖拽,但我不知道如何做。

附注:为了在我的SwiftUI视图中调用ColorPanel,我这样做:

代码语言:javascript
复制
ColorPanel.shared.show(stage: stage)
EN

回答 1

Stack Overflow用户

发布于 2020-01-10 01:08:03

请尝试我将使用的方法。免责声明:由于缺少Firestore安装程序而未测试

代码语言:javascript
复制
import Combine

class ColorPanel {

    static var shared = ColorPanel()

    private var stage: DB.Stage.Document? = nil

    private let cp = NSColorPanel.shared

    private var subscriber: AnyCancellable?
    private let publisher =
        PassthroughSubject<NSColor, Never>()
            .throttle(for: 10, scheduler: RunLoop.main, latest: true)

    init() {
        cp.setTarget(self)
        cp.setAction(#selector(colorDidChange(sender:)))
        cp.isContinuous = true
    }

    func show(stage: DB.Stage.Document) {
        self.stage = stage
        self.subscriber = nil

        if stage != nil {
            self.subscriber = self.publisher
                .sink { _ in
                    self.stage.update() // << be called once per 10 seconds
                }
        }
        cp.makeKeyAndOrderFront(nil)
    }

    @objc func colorDidChange(sender: NSColorPanel) {
        guard let stage = stage else { return }
        stage.data?.color.red = Double(sender.color.redComponent)
        stage.data?.color.green = Double(sender.color.greenComponent)
        stage.data?.color.blue = Double(sender.color.blueComponent)

        self.publisher.upstream.send(sender.color)
    }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59667482

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档