我目前正在向这样的房产信号注册订阅者:
[RACAble(self.test) subscribeNext:^(id x) {
NSLog(@"signal fired!");
}];
Run Code Online (Sandbox Code Playgroud)
默认功能是它每次都会触发self.test被更改,但我只想要触发一次,然后取消订阅.在创建此订阅者时,是否可以将"一次"参数或修饰符传递给RAC?
我阅读了使用Scala.React弃用Observer模式,发现反应式编程非常有趣.
但有一点我无法弄清楚:作者将信号描述为DAG(有向无环图)中的节点.那么如果你有两个信号(或事件源,或模型,w/e)相互依赖怎么办?即"双向绑定",如网络前端编程中的模型和视图.
有时它只是不可避免的,因为用户可以更改视图,后端(例如异步请求)可以更改模型,并且您希望另一方立即反映更改.
行为被普遍定义为"时变值" 1.
为什么?时间是变化值的依赖/参数非常罕见.
我对FRP的直觉是将行为改为事件变化值; 它更常见,更简单,我发布了更多有效的想法,并且可扩展到足以支持时间(tick事件).
例如,如果你编写一个计数器,你不关心时间/相关的时间戳,你只关心"点击增加按钮"和"减少按钮点击"事件.
如果你写一个游戏并想要一个位置/力量行为,你只关心WASD /箭头键举行的事件等(除非你禁止你的球员在下午向左移动;多么不公平!).
所以:为什么时间是一个考虑因素?为什么时间戳?为什么一些库(例如reactive-banana,reactive)把它上升到具有的程度Future,Moment值?为什么使用事件流而不是仅响应事件发生?所有这一切似乎都过于复杂化了一个简单的想法(事件变化/事件驱动值); 有什么好处?我们在这里解决了什么问题?(如果可能的话,我也希望得到一个具体的例子和一个精彩的解释).
theory haskell functional-programming frp reactive-programming
我一直在研究FRP,发现了一堆不同的实现.我见过的一个模型是我将其称为"信号"表示的模型.这一基本要素将事件和行为结合到一个实体中.
首先,Signal是一个值为行为的对象.其次,信号有一个事件'流',可以作为标准数据结构查看和操作(您可以在信号上使用'each','map'和'filter'等来定义事件如何反应).例如,我可以这样做(其中'时间'是时间的信号表示):
time.each { t => print(t) } // every time there is a 'tick' the current time is printed
a = time * 5 //where 'a' would be a dynamic value always up to date with time
Run Code Online (Sandbox Code Playgroud)
FRP的这种表示是正确的还是有问题?我非常喜欢它的工作方式以及个人描述的简单方法,但我不确定它的正确性.
programming-languages functional-programming frp reactive-programming
假设我有一个事件触发器,我想在触发时做两件事.首先,我希望它更新某些行为的价值.其次,如果满足其他条件,我希望它使用更新的行为值触发另一个事件send_off.以代码形式表示,假设我有
trigger :: Event b
trigger = ...
updateFromTrigger :: b -> (a -> a)
updateFromTrigger = ...
conditionFromTrigger :: b -> Bool
conditionFromTrigger = ...
behavior :: Behavior a
behavior = accumB initial_value (updateFromTrigger <$> trigger)
send_off :: Event a
send_off = ?????? (filterE conditionFromTrigger trigger)
Run Code Online (Sandbox Code Playgroud)
然后问题是:我把什么放在?????? 以便send_off发送最新的行为值,我的意思是包含刚刚应用于它的触发器更新的值.
不幸的是,如果我理解正确,行为的语义是这样的,更新的值不会立即可用,所以我这里唯一的选择是复制工作并重新计算行为的更新值,以便我可以立即使用它在另一个事件中,即填写?????? 喜欢的东西
send_off =
flip updateFromTrigger
<$>
behavior
<@>
filterE conditionFromTrigger trigger
Run Code Online (Sandbox Code Playgroud)
现在,有一种感觉我可以通过使用Discrete而不是Behavior来立即使我 …
使用ReactiveCocoa,似乎有两种方法让订阅者从信号中接收相同的值,而不是重新触发生成这些值的任何操作:通过RACReplaySubject或RACMulticastConnection.
以下是RACReplaySubject的标题文档:
重播主题保存发送的值(达到其定义的容量)并将其重新发送给新订户.它还将重播错误或完成.
对于RACMulticastConnection:
多播连接封装了向许多订户共享信号订阅的想法.如果对基础信号的订阅涉及副作用或不应多次调用,则通常需要这样做.
多播信号仅在
-[RACMulticastConnection connect]被呼叫时订阅 .在此之前,不会发送任何值signal.了解-[RACMulticastConnection autoconnect]如何-[RACMulticastConnection connect]自动调用.请注意,您不应手动创建RACMulticastConnection.而是使用
-[RACSignal publish]或-[RACSignal multicast:].
有人可以提供关于何时使用RACReplaySubject或RACMulticastConnection的简单指南?
我想知道是否有一个cache()运营商可以缓存x个数量的排放,但也会在指定的时间间隔(例如1分钟)后使它们到期.我在寻找像......
Observable<ImmutableList<MyType>> cachedList = otherObservable
.cache(1, 1, TimeUnit.MINUTES);
Run Code Online (Sandbox Code Playgroud)
这将缓存一个项目,但会在一分钟后过期并清除缓存.
我做了一些研究,找到了重播算子.看起来它可以满足这种需求,但我有一些问题.为什么它很热并且需要连接?这是否与cache()运营商不同?我知道cache()模仿一个主题,但它不需要连接.
在探索RxSwift时
我发现只有textField.rx_text.asObservable()属性,每个键盘按钮被击中时触发事件.
但是我们如何处理"搜索"或"完成"按钮事件?我想在这些操作之后才进行搜索,而不是"在键入时搜索".
Observable.create((Subscriber<? super String> s) -> {
System.out.println("subscribing");
s.onError(new RuntimeException("always fails"));
}).retryWhen(attempts -> {
return attempts.zipWith(Observable.range(1, 3), (n, i) -> i).flatMap(i -> {
System.out.println("delay retry by " + i + " second(s)");
return Observable.timer(i, TimeUnit.SECONDS);
});
}).toBlocking().forEach(System.out::println);
Run Code Online (Sandbox Code Playgroud)
但是如果重试用完,我该如何传播错误?
添加.doOnError(System.out::println) 后的retryWhen条款不捕获错误.它甚至被排出了吗?
添加.doOnError(System.out::println) 之前always fails重试时显示所有重试次数.
我正在使用spring-webflux WebClient (build 20170502.221452-172)来访问一个Web应用程序,生成一个Entry对象流(application/stream + json),如下所示:
final WebClient producerClient = WebClient.create("http://localhost:8080/");
Flux<Entry> entries = producerClient.get().uri("json-stream")
.accept(MediaType.APPLICATION_STREAM_JSON)
.exchange()
.flatMapMany(clientResponse -> clientResponse.bodyToFlux(Entry.class));
Run Code Online (Sandbox Code Playgroud)
虽然Entry对象的反序列化适用于使用标准公共类型的POJO,包括Java时间(JSR-310)数据类型,如java.time.Instant,但我想知道为了将任何自定义JSON添加到Java反序列化,我必须做什么(例如,自定义Jackson ObjectMapper).
我无法在WebClient或其构建器和流畅API生成的对象的类中找到任何API 来执行此操作.
有没有人使用WebClient进行自定义反序列化?
(也许API不存在,但是?)