Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift联合收割机:对任何订户来说都是替代方案?_Swift_Subscriber_Combine - Fatal编程技术网

Swift联合收割机:对任何订户来说都是替代方案?

Swift联合收割机:对任何订户来说都是替代方案?,swift,subscriber,combine,Swift,Subscriber,Combine,当我的红色、绿色或蓝色变量发生变化时,我尝试使用Combine更新颜色。我看过的例子使用sink(),这对我来说似乎很合适,但我找不到替代的 似乎有效的方法是对计算变量使用assign(),但这似乎有点像黑客 init(){ redcancelable=red.hasChanged.receive(on:RunLoop.main)。assign(to:\.rgbUpdated,on:self) } 有没有办法保存sink()返回的值?这听起来像是CombineTest的工作。是的,sink是

当我的红色、绿色或蓝色变量发生变化时,我尝试使用Combine更新颜色。我看过的例子使用sink(),这对我来说似乎很合适,但我找不到替代的

似乎有效的方法是对计算变量使用assign(),但这似乎有点像黑客


init(){
redcancelable=red.hasChanged.receive(on:RunLoop.main)。assign(to:\.rgbUpdated,on:self)
}

有没有办法保存sink()返回的值?

这听起来像是CombineTest的工作。是的,
sink
是以您喜欢的任何方式处理管道末端的完美方式

这里有一个简单的例子。我将从一个具有
r
g
b
变量的对象开始:

class ColorObject {
    @Published var r : CGFloat = 1
    @Published var g : CGFloat = 1
    @Published var b : CGFloat = 1
}
现在想象一下,在某个地方,我们有这个物体的一个实例;称之为
colorObject
。然后,我们可以配置发布服务器:

let rpub = colorObject.$r
let gpub = colorObject.$g
let bpub = colorObject.$b
let colorpub = Publishers.CombineLatest3(rpub,gpub,bpub)
    .map { UIColor(red: $0.0, green: $0.1, blue: $0.2, alpha: 1) }
结果是,每当
colorObject
r
g
b
发生变化时,一个UIColor就会出现在管道中。现在,通过使用
sink
订阅,我们可以从
colorpub
接收通知,并根据需要处理结果。让我们将某个界面对象的颜色设置为该颜色:

let sink = colorpub.sink { self.view.backgroundColor = $0 }
或者,我可以使用
assign
编写它,这可能更干净,尽管
backgroundColor
是可选的,因此我必须插入
map
操作符,因为关键路径不是协变的:

let assign = colorpub.map{Optional($0)}
    .assign(to: \.backgroundColor, on: self.view)
现在,每当
colorObject
r
g
b
发生变化时,视图的颜色也会相应地发生变化

这不是实现这一目标的唯一途径——远非如此!但这是一个简单的例子,用Combine完成事情。一个可能有用的变体是将
colorpub
publisher向上移动到ColorObject中;这样,ColorObject就可以直接向自己出售颜色:

class ColorObject {
    @Published var r : CGFloat = 1
    @Published var g : CGFloat = 1
    @Published var b : CGFloat = 1
    lazy var colorpub = Publishers.CombineLatest3($r,$g,$b)
        .map { UIColor(red: $0.0, green: $0.1, blue: $0.2, alpha: 1) }
}
这不会改变
接收器
分配

let sink = colorObject.colorpub.sink { // ... whatever
// or
let assign = colorObject.colorpub.map{Optional($0)}
    .assign(to: \.backgroundColor, on: self.view)

谢谢,很遗憾您需要借助objective c来获得一个快速的框架来工作。您似乎想要使用KVO。如果您愿意,我可以使用PassthroughSubject重写它。让我颤抖吧,这只是一个例子。拿走对你有帮助的东西,剩下的就留下。我没有展示的是hasChanged属性是一个PassthroughSubject发布者,我很抱歉。没关系,发布者就是发布者。这就是重点。好吧,改为
@Published
,这样我们就不依赖KVO了,我希望这能让您满意