标签: reactive-programming

如何创建仅接收一次信号的ReactiveCocoa订阅者,然后取消订阅/释放自己?

我目前正在向这样的房产信号注册订阅者:

[RACAble(self.test) subscribeNext:^(id x) {
        NSLog(@"signal fired!");
 }];
Run Code Online (Sandbox Code Playgroud)

默认功能是它每次都会触发self.test被更改,但我只想要触发一次,然后取消订阅.在创建此订阅者时,是否可以将"一次"参数或修饰符传递给RAC?

objective-c reactive-programming ios reactive-cocoa

17
推荐指数
1
解决办法
3731
查看次数

如何相互依赖处理这两个信号?

我阅读了使用Scala.React弃用Observer模式,发现反应式编程非常有趣.

但有一点我无法弄清楚:作者将信号描述为DAG(有向无环图)中的节点.那么如果你有两个信号(或事件源,或模型,w/e)相互依赖怎么办?即"双向绑定",如网络前端编程中的模型和视图.

有时它只是不可避免的,因为用户可以更改视图,后端(例如异步请求)可以更改模型,并且您希望另一方立即反映更改.

scala frp reactive-programming

17
推荐指数
1
解决办法
1240
查看次数

为什么FRP将时间视为价值因素?

行为被普遍定义为"时变值" 1.

为什么?时间是变化值的依赖/参数非常罕见.

我对FRP的直觉是将行为改为事件变化值; 它更常见,更简单,我发布了更多有效的想法,并且可扩展到足以支持时间(tick事件).

例如,如果你编写一个计数器,你不关心时间/相关的时间戳,你只关心"点击增加按钮"和"减少按钮点击"事件.
如果你写一个游戏并想要一个位置/力量行为,你只关心WASD /箭头键举行的事件等(除非你禁止你的球员在下午向左移动;多么不公平!).

所以:为什么时间是一个考虑因素?为什么时间戳?为什么一些库(例如reactive-banana,reactive)把它上升到具有的程度Future,Moment值?为什么使用事件流而不是仅响应事件发生?所有这一切似乎都过于复杂化了一个简单的想法(事件变化/事件驱动值); 有什么好处?我们在这里解决了什么问题?(如果可能的话,我也希望得到一个具体的例子和一个精彩的解释).

1行为已经定义,所以在这里,这里,这里 ......以及我遇到过的所有地方.

theory haskell functional-programming frp reactive-programming

17
推荐指数
2
解决办法
1190
查看次数

功能反应式编程的"信号"表示是否正确?

我一直在研究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

16
推荐指数
1
解决办法
3243
查看次数

reactive-banana:包含行为最新值的触发事件

假设我有一个事件触发器,我想在触发时做两件事.首先,我希望它更新某些行为的价值.其次,如果满足其他条件,我希望它使用更新的行为值触发另一个事件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来立即使我 …

haskell frp reactive-programming reactive-banana

16
推荐指数
1
解决办法
363
查看次数

何时使用RACReplaySubject与RACMulticastConnection?

使用ReactiveCocoa,似乎有两种方法让订阅者从信号中接收相同的值,而不是重新触发生成这些值的任何操作:通过RACReplaySubject或RACMulticastConnection.

以下是RACReplaySubject的标题文档:

重播主题保存发送的值(达到其定义的容量)并将其重新发送给新订户.它还将重播错误或完成.

对于RACMulticastConnection:

多播连接封装了向许多订户共享信号订阅的想法.如果对基础信号的订阅涉及副作用或不应多次调用,则通常需要这样做.

多播信号仅在-[RACMulticastConnection connect]被呼叫时订阅 .在此之前,不会发送任何值signal.了解-[RACMulticastConnection autoconnect]如何 -[RACMulticastConnection connect]自动调用.

请注意,您不应手动创建RACMulticastConnection.而是使用 -[RACSignal publish]-[RACSignal multicast:].

有人可以提供关于何时使用RACReplaySubject或RACMulticastConnection的简单指南

objective-c reactive-programming reactive-cocoa

16
推荐指数
1
解决办法
4343
查看次数

RxJava- cache()与replay()相同吗?

我想知道是否有一个cache()运营商可以缓存x个数量的排放,但也会在指定的时间间隔(例如1分钟)后使它们到期.我在寻找像......

Observable<ImmutableList<MyType>> cachedList = otherObservable
    .cache(1, 1, TimeUnit.MINUTES); 
Run Code Online (Sandbox Code Playgroud)

这将缓存一个项目,但会在一分钟后过期并清除缓存.

我做了一些研究,找到了重播算子.看起来它可以满足这种需求,但我有一些问题.为什么它很热并且需要连接?这是否与cache()运营商不同?我知道cache()模仿一个主题,但它不需要连接.

java reactive-programming rx-java

16
推荐指数
1
解决办法
8508
查看次数

如何在rxSwift中处理"完成"返回键按下事件?

在探索RxSwift时

我发现只有textField.rx_text.asObservable()属性,每个键盘按钮被击中时触发事件.

但是我们如何处理"搜索"或"完成"按钮事件?我想在这些操作之后才进行搜索,而不是"在键入时搜索".

reactive-programming swift2 rx-swift

16
推荐指数
3
解决办法
8658
查看次数

如果重试时出现捕获错误:重试耗尽

Retry文档中,示例如下所示:

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重试时显示所有重试次数.

reactive-programming rx-java

16
推荐指数
3
解决办法
5382
查看次数

如何自定义SpringWebFlux WebClient JSON反序列化?

我正在使用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不存在,但是?)

java spring json reactive-programming spring-webflux

16
推荐指数
6
解决办法
8251
查看次数