问题标签 [reactive-cocoa]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
ios - Reactive Cocoa 中的可取消超时
我想在 iOS 中使用Reactive Cocoa实现倒数计时器。计时器应该运行 X 秒并每秒执行一些操作。我无法弄清楚的部分是我可以取消 timeout的方式。
cocoa - 如何在进行 API 调用之前使用 ReactiveCocoa 进行透明身份验证?
我在调用远程 Web API 的应用程序中使用 ReactiveCocoa。但在从给定的 API 主机检索任何东西之前,应用程序必须提供用户的凭据并检索 API 令牌,然后使用该令牌对后续请求进行签名。
我想抽象出这个身份验证过程,以便每当我进行 API 调用时它都会自动发生。假设我有一个包含用户凭据的 API 客户端类。
如何使用 ReactiveCocoa 透明地导致对 API 的第一个(也是唯一一个)请求进行检索,并作为副作用,在发出任何后续请求之前安全地存储 API 令牌?
这也是我可以使用combineLatest:
(或类似方法)启动多个同时请求并且它们都将隐式等待检索令牌的要求。
此外,如果在进行 API 调用时检索令牌请求已经在进行中,则该 API 调用必须等待直到检索令牌请求完成。
我的部分解决方案如下:
基本模式将用于将flattenMap:
产生令牌的信号映射到给定令牌的信号,该信号执行所需的请求并产生 API 调用的结果。
假设一些方便的扩展NSURLRequest
:
现在考虑-getToken
.
- 在普通情况下,当令牌已经被检索到时,订阅会立即生成令牌。
- 如果尚未检索到令牌,则订阅将遵循返回令牌的身份验证 API 调用。
- 如果身份验证 API 调用正在进行中,添加另一个观察者应该是安全的,而不会导致身份验证 API 调用通过网络重复。
但是我不确定如何做到这一点。另外,如何以及在哪里安全地存储令牌?某种持久/可重复的信号?
cocoa - ReactiveCocoa 的引用所有权语义是什么?
当我创建一个信号并将其带入函数范围时,根据 Cocoa 约定,它的有效保留计数为 0:
当我订阅信号时,它会保留订阅者并返回一个一次性的,根据 Cocoa 约定,它的保留计数也为零。
大多数情况下,订阅者将关闭并引用self
其 ivars 或封闭范围的其他部分。因此,当您订阅信号时,该信号具有对订阅者的拥有引用,而订阅者具有对您的拥有引用。并且您获得的一次性产品具有对信号的拥有引用。
假设您持有该一次性用品,以便您可以在某个时候取消订阅(例如,如果信号正在从 Web 服务检索数据并且用户导航离开屏幕,取消她查看正在检索的数据的意图)。
此时我们有一个循环引用:
负责任的事情是确保在取消请求时或在请求完成后中断循环。
self
请注意,在被释放时您不能这样做,因为由于保留周期,这永远不会发生!在回调订阅者期间打破保留周期似乎也有些可疑,因为信号可能在其实现仍在调用堆栈上时被释放。
我还注意到该实现保留了一个活动信号的全局进程列表(截至我最初提出这个问题时)。
使用 RAC 时我应该如何考虑所有权?
ios - 没有订阅者时停止发布,有订阅者时自动启动
我将如何实现RACSignal
在没有订阅者时停止发布并在有订阅者时自动启动?
这是一个场景:
假设我currentLocationSignal
在AppDelegate
. 我LocationViewController
会currentLocationSignal
在视图加载时订阅并在视图卸载时取消订阅(处置)。由于获取当前位置需要几秒钟,我希望始终订阅currentLocationSignal
应用程序打开的时间(并在几秒钟后自动取消订阅),所以当我到达时,LocationViewController
我会得到一个准确的位置。因此,信号的订阅者可能不止一个。当第一个订阅者收听时,它需要开始调用startUpdatingLocation
,当没有订阅者时,它需要调用stopUpdatingLocation
。
objective-c - 何时使用 RACReplaySubject 与 RACMulticastConnection?
使用ReactiveCocoa,似乎有两种方法可以让订阅者从信号中接收相同的值,而不是重新触发生成这些值的任何操作:通过 RACReplaySubject 或 RACMulticastConnection。
以下是 RACReplaySubject 的标头文档:
重播主题保存它发送的值(直到其定义的容量)并将这些值重新发送给新的订阅者。它还将重播错误或完成。
对于 RACMulticastConnection:
多播连接封装了将一个订阅共享给多个订阅者的想法。如果对基础信号的订阅涉及副作用或不应多次调用,则通常需要这样做。
多播信号仅在
-[RACMulticastConnection connect]
被调用时订阅。在此之前,不会在 上发送任何值signal
。查看-[RACMulticastConnection autoconnect]
如何-[RACMulticastConnection connect]
自动调用。请注意,您不应手动创建 RACMulticastConnection。而是使用
-[RACSignal publish]
or-[RACSignal multicast:]
。
有人可以提供关于何时使用 RACReplaySubject 或 RACMulticastConnection 的简单指南吗?
ios - RACSignal combineLatest 使用多个 UIControls
我正在尝试使用Reactive Cocoa,但在组合来自多个 UIControls 的信号时遇到了麻烦。
我正在为 UIEdgeInsets 创建一个编辑器,并有四个 UISteppers,用于顶部、左侧、底部和右侧的插图。
我想做的是:
但是,这绝不会导致信号被处理。
如果我只包含一个信号,如下所示:
它按预期工作(单独观察任何其他步进器也可以正常工作)但对于多个控件,我什么也得不到。我可以通过将每个控件视为一个单独的信号来解决问题,但这似乎错过了combineLatest
方法的重点。我做错了什么,还是应该在 RAC 项目上提出问题?
ios - 如何创建一个仅接收一次信号的 ReactiveCocoa 订阅者,然后自行取消订阅/释放?
我目前正在为这样的属性信号注册订阅者:
默认功能是每次更改 self.test 时都会触发,但我只想触发一次,然后取消订阅。创建此订阅者时,是否可以将“一次”参数或修饰符传递给 RAC?
ios - 将 RACCommand 与异步网络操作一起使用
我UAGitHubEngine
用来访问 GitHub 的 API。我想编写一个功能性的反应式应用程序来获取一些数据。我依靠这里的代码来设置异步网络请求。我正在寻找的是一些名为“General”的团队的团队 ID。我可以做过滤/打印部分OK:
但是设置命令对我来说是个谜:
如何设置信号块以在某些异步网络调用返回时返回推送事件的信号?
objective-c - ReactiveCocoa takeUntil 和 takeWhile 不发送最后一个“下一个”
考虑以下代码段:
这里发生的是startRouting
返回RACSignal
发送会话 ID 的 a 。
updateRoutingWithSession:
返回 a RACSignal
,它发送包含属性的NSDictionary
外观。PercentComplete
民意调查之间有两秒钟的延迟。
fetchFlights
将运行直到updateRoutingWithSession:
有PercentComplete
100 个。
我的问题是最后一个sendNext:
,即takeUntilBlock
返回的地方true
,没有到达RACSubscriber
.
我错过了什么?
ios - 在 ReactiveCocoa 中链接依赖信号
在 ReactiveCocoa 中,如果我们链接多个依赖信号,我们必须使用subscribeNext:
链中的下一个信号来接收前一个信号产生的值(例如,异步操作的结果)。所以过了一会儿,代码变成了这样(省略了不必要的细节):
这种不断增加的嵌套看起来并不比文档中给出的非反应性示例好多少:
我错过了什么吗?在 ReactiveCocoa 中是否有更好的链接依赖工作的模式?