- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
从 reactive swift 的文档中我可以理解Flattening
。可以找到其中的示例 here .在 Flattening event streams
部分中,一切都得到了完美的讨论。
我对 flatmap
感到困惑。根据文档,它将每个事件从 self 映射到一个新的生产者,然后根据策略 - concat/merge/latest 将生成的生产者扁平化
。所以,我猜它应该类似于flattening
。
但是,我无法生成类似的行为。例如考虑以下代码段。如果我更改扁平化策略,如 concat/merge/latest
,输出不会改变。
let (numbersSignal, numbersObserver) = Signal<String, NoError>.pipe()
numbersSignal.producer.flatMap(.concat) { value -> SignalProducer<String, NoError> in
print("Outer Signal Producer \(value)")
return SignalProducer<String, NoError> {
observer, lifetime in
print("Inner Signal Producer \(value)")
observer.send(value: "Inner")
observer.sendCompleted()
}
}.observe(on: UIScheduler()).startWithValues { result in
print("Observer \(result)")
}
numbersObserver.send(value: "A")
numbersObserver.send(value: "B")
numbersObserver.send(value: "C")
numbersObserver.sendCompleted()
输出:
Outer Signal Producer A
Inner Signal Producer A
Observer Inner
Outer Signal Producer B
Inner Signal Producer B
Observer Inner
Outer Signal Producer C
Inner Signal Producer C
Observer Inner
谁能解决这个问题?
此外,能否提供关于flatmap
区分merge、concat、latest
效果的例子?
最佳答案
这里发生的事情是您在 flatMap
中创建的生产者同步完成;您在开始闭包本身内调用 sendCompleted
。所以在 flatMap
中,它在生产者上调用 start
并且生产者在调用 start
甚至返回之前完成。这意味着 flatMap
没有机会应用不同的策略;每个生产者在启动后立即完成。
我们可以通过在 flatMap
中创建异步生产者来了解不同策略的行为方式(请注意,我使用的是最新版本的 Swift 和 ReactiveSwift,所以我使用的是 Never
而不是 NoError
):
let (numbersSignal, numbersObserver) = Signal<TimeInterval, Never>.pipe()
numbersSignal.producer
.flatMap(.concat) { value -> SignalProducer<TimeInterval, Never> in
print("Outer Signal Producer \(value)")
return SignalProducer(value: value).delay(value, on: QueueScheduler())
}
.startWithValues { result in
print("Observer \(result)")
}
numbersObserver.send(value: 5)
numbersObserver.send(value: 2)
numbersObserver.send(value: 1)
在这个例子中,我们发送 TimeInterval
值,每个创建的生产者发送给定的值,延迟等于该值。
concat:每个后续生产者在开始之前等待前一个生产者完成,因此值按照我们发送它们的确切顺序打印。
Outer Signal Producer 5.0
Outer Signal Producer 2.0
Outer Signal Producer 1.0
Observer 5.0
Observer 2.0
Observer 1.0
合并:一旦我们发送值,所有生产者都会立即启动,因此它们都同时运行。因此,值从小到大打印,即延迟最短的生产者最先完成。
Outer Signal Producer 5.0
Outer Signal Producer 2.0
Outer Signal Producer 1.0
Observer 1.0
Observer 2.0
Observer 5.0
最新:只打印最后一个值,因为每个生产者在新值进来时被取消;只允许最后一个值运行完成。
Outer Signal Producer 5.0
Outer Signal Producer 2.0
Outer Signal Producer 1.0
Observer 1.0
请注意,在所有三种情况下,首先为所有值打印“外部信号生成器”消息。这是因为我们给 flatMap
的闭包总是在有新值进来时立即运行。但是生成的生产者根据扁平化策略启动和取消。
关于ios - ReactiveSwift 中平面图策略之间的差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58607151/
我有一个简单的信号,在其中一个应用程序组件中,它返回一组项目: var itemsSignal: Signal 那些项目可能包含以表格 View 形式呈现在屏幕上的数据的更新。任务是将更新应用于屏幕上
我已阅读 documentation ,浏览了他们精彩的 Playground 示例,搜索了 S.O.,并达到了我的 google-fu 的范围。 ,但我无法终生思考如何使用 ReactiveSwif
我是 ReactiveSwift 的初学者。这是在我的 View 模型中获取代码: private let viewDidLoadProperty = MutableProperty(nil)
从 reactive swift 的文档中我可以理解Flattening。可以找到其中的示例 here .在 Flattening event streams 部分中,一切都得到了完美的讨论。 我对
我已经使用 ReactiveSwift 几个月了,但有一点我还没有完全理解:生命周期对象。 例如,假设我有一个将进行 API 调用的 SignalProducer,它包装在一个类中: class Se
我已多次阅读文档并需要澄清... 给定以下代码段: let signal: Signal //call this observer y signal.take(first: 1).observeVal
一般来说,ReactiveSwift 和 FRP 的新功能,试图构建一个小型计算器应用程序以尝试掌握它的窍门,但我一直在寻找响应式(Reactive)方法来做这样的事情。如果我有一个接受值的函数,我如
假设我有一个元素数组 [1, 2, 3] 和 5 秒的延迟。 我想发射数组的每个元素,在发射的当前元素和下一个元素之间有一个暂停。 例子: 输出: [00:00] -- 1 [00:05] -- 2
我正在训练自己使用 ReactiveSwift用于网络和一个很好的用例似乎是从 Google Places API for iOS 获取某个位置的照片. 流程如下: 从 Google 地点 ID 获取
当我用我想发送的字段做表单时,如果有我经常做的更改 let initialOrChangedName = Signal.merge( nameChanged.signal, self.vi
作为 this 的后续问题,收到 this fantastic answer ,并使用以下示例... class Model { let mapType = MutableProperty(.
人们如何转换我的代码: struct CarModel { var model: String? var make: String? var kilowatts: Int?
由于我是响应式(Reactive)编程的新手,所以我对在 ReactiveSwift 中链接 SignalProducers 有一些初学者的问题。我的目标是创建一个 SignalProducers 链
我是 ReactiveSwift 的初学者。我创建了天气应用程序,但我的请求不起作用。 func fetchCurrentWeather() -> SignalProducer { guard
我在我的项目中使用 ReactiveSwift,我想知道 PublishSubject 的等价物是什么? 例如在 RXSwift 中我们可以这样做: let disposeBag = DisposeB
我对使用 ReactiveSwift 和 ReactiveCocoa 相当陌生,我似乎遇到了有关初始化具有依赖项的属性的正确方法的障碍。 例如在下面的代码中,我尝试初始化一个属性,但我得到了预期的编译
现在我对 ReactiveSwift 很感兴趣,并尝试将其添加到项目的网络操作中。但是observeResult方法的action返回类型存在一些问题。 查看模型: final class TestV
您好,我是响应式 swift 的新手。在我的新项目中,我使用的是 ReactiveSwift。我通过使用 SafeSignal 变量观察值。我想在获取值之前中断信号。请帮我解决这个问题。 最佳答案 一
我使用 ReactiveSwift 有一段时间了,但突然遇到了一个奇怪的错误什么的。 我正在使用 MVVM 架构,并有一个简单的 View Controller 和一个 View 模型。 VM 具有类
我正在使用 ReactiveSwift 创建一个包含字典的结构。我想听字典的变化。 struct Model { let a: MutableProperty = MutablePropert
我是一名优秀的程序员,十分优秀!