问题标签 [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 - RACCommand 初始化器信号未命中正在执行的信号
我一直在研究一个MVVM 示例,使用 ReactiveCocoa,它是集合视图中 App.net 帖子的简单集合,它在到达集合视图的边缘之前加载更多帖子。
但是,我的视图模型上的命令有问题。我创建了一个命令,通过 AFNetworking 客户端加载帖子,并在它们被建模后做出响应。当它完成时,它会向创建命令的信号发送响应,并完成信号。
在我看来,我创建了一个信号来发送剩余的帖子计数。
我将这些值发送到我的视图模型上的主题。
视图模型中的主题是这样实例化的:
一切都按预期工作,除了向我的命令信号发送值和完成。发生网络请求,我的帖子被建模,但是,视图从未收到任何关于self.postQueue.loadPostsCommand.executionSignals
信号的值。
同样,我的项目在 GitHub上的分支 reload-signal-rework 中。有什么想法吗?
ios - 如何有条件地缓冲 RACSignal 值?
我正在处理一些通过 websockets 与远程 API 交互的代码。我的数据层负责建立和监控 websocket 连接。它还包含应用程序可用于将要发送的 websocket 消息排入队列的方法。应用程序代码不应负责检查 websocket 连接的状态,即即发即弃。
理想情况下,我希望数据层的功能如下:
- 当数据层没有与 websocket 端点 (
self.isConnected == NO
) 的连接时,消息会在内部缓冲。 - 当连接可用时 (
self.isConnected == YES
),缓冲的消息会立即发送,并且任何后续消息都会立即发送。
这是我能想到的:
最后,这是如何使用它的伪代码:
我的问题是:这是缓冲值的正确方法吗?有没有更惯用的 RAC 方式来处理这个问题?
objective-c - ReactiveCocoa 中的缓存失效
总的来说,我仍然在研究 RAC 和 FRP——目前正在努力弄清楚如何实现我通常不得不在其他地方使用的模式。
假设我正在制作一个抽认卡应用程序,主屏幕是我的卡片组列表。这个应用程序使用网络服务器的状态作为事实来源。我不想每次显示屏幕时都从服务器重新获取此卡组列表 - 太好了,我可以在带有重播主题的多播信号中使用延迟网络请求来有效地记忆该列表。
我有两种方法可以通过从服务器重新获取来刷新此列表,这对我来说很复杂。我希望能够在应用程序中发生任何数量的事情时使这个“缓存”列表无效(例如,用户导航到其他屏幕并执行会使主屏幕上的牌组列表过时的操作,或者应用程序刚刚被重新唤醒,所以我们可以猜测它可能已经过时了),所以下次用户返回到这个主屏幕时,它一开始不会显示任何内容(而不是显示旧列表,因为它知道它是由于用户的操作而过期)并将重新获取列表,并在下载后显示它。我怎样才能最优雅地处理这种“无效”状态(希望没有实际状态)?
我还希望能够在超时时使“缓存”列表过期 - 基本上,甲板列表信号会给出缓存列表,直到足够的时间过去,此时它会在提供数据之前懒惰地发出网络请求。
我对如何实现这两件事有一些想法,但它们似乎有点令人费解。很想得到一些指导或被指出一些示例项目的方向。
我可以看到处理此问题的一种简单方法是拥有一个命令式服务层,并命令式处理缓存和缓存失效,并使用广播事件使缓存无效,然后从缓存返回或产生网络请求以填充缓存反应层尝试访问数据。如果不首先了解这样做的反应方式,我宁愿不遵循这种方法。
谢谢!
ios - 从控件中删除 ReactiveCocoa 信号
如果我将信号分配给控件的属性:
但是后来想分配一个不同RACSignal
的 to enabled
,我怎么能在这样做之前清除任何现有的?
如果我再次尝试设置它,我会收到如下异常:
objective-c - Objective-C self->_ivar 访问与显式与隐式 self->
一般问题
直到现在,我一直认为self->_ivar
等于_ivar
. 今天我发现这并不完全正确。
例如,请参见以下代码片段:
即使我self
用一些NSInteger
也命名self
的东西隐藏了原件,隐含的 ivar 语法_testIVar
仍然可以找到“原始”自我,而self->_testIVar
显然没有。在后一种情况下,编译器正确地抱怨
成员引用类型“NSInteger”(又名“long”)不是指针
然而,在第一种情况下,它只是有效。
现实世界的问题
这个例子可能看起来相当人为,但它根本不是。例如,ExtObjC项目(由ReactiveCocoa使用)定义了非常方便的方法@weakify(var)
,它通过定义非常方便的语法(不再需要编写奇怪和繁琐的语法)@strongify(var)
来帮助防止在块中强捕获(和其他对象 )。例如:self
__weak typeof(self) weakSelf = self; [...] ^{ __strong typeof(self) strongSelf = weakSelf; [...] }
如果没有@weakify
and @strongify
,该块将捕获对 的强引用self
。与它@weakify
并@strongify
没有。self
因此,在块运行之前,不会推迟释放。但是,主要优点是您不需要记住使用weakSelf
orstrongSelf
代替,self
因为“原始”self
是隐藏的。
这非常方便,ExtObjC通过使用宏生成类似于以下内容的@weakify
/来实现:@strongify
很公平,这更好,因为我们可以继续使用self
而无需实际捕获对self
. 然而,只要我们使用implicit-ivars-of-self-syntax,对“原始”的强引用self
仍然会被捕获!
杂项
在块中使用 ivars 时,我们肯定会捕获self
. 例如,请参阅此屏幕截图:
。
屏幕截图的另一个有趣之处是警告消息是
未使用的变量“自我”
在下面的行中
在此块中强烈捕获“自我”可能会导致保留周期
这就是为什么我认为有两个版本的self
:-)
问题
这里的实际问题是:到底是什么_testIVar
意思?它如何找到“原始”self
指针?
澄清(另见我的屏幕截图):正如@MartinR 指出的(这也是我的想法),有一些特殊版本self
无法更改,仅用于隐式自我ivar-access。这在某处有记录吗?基本上在哪里定义了隐式self
指的是什么?它的行为似乎与例如 Java 的行为相同 (with this
),但不同之处this
在于您无法覆盖的保留关键字。
问题也不是如何“修复”它,只是写self->_testIVar
将是我在@weakify
/@strongify
示例中想要的。我认为通过使用@weakify
/@strongify
你不能再犯隐式强捕获的错误,self
但事实似乎并非如此。
objective-c - 对象的 NSArray 的 RACSignal
我的 ViewController 上有一个 NSArray 的 ViewModel 对象:
@property (nonatomic, strong) NSArray *viewModels;
ViewModel 对象看起来像这样:
我正在尝试在 RACCommand 的 init 方法上为 enabledSignal 创建一个 RACSignal:
如果选择了 0 个 viewModel 对象,或者选择的 viewModel 的数量等于 viewModel 的总数,此信号将告诉命令启用。
我可以创建一个 RACSequence,它将为我提供此代码选择的 viewModel 对象:
我将如何创建有效信号?
objective-c - ReactiveCocoa:消除订阅中的状态下一个:块
我的 VC 中有以下代码:
yContentOffset
我要删除的 VC 属性在哪里。(它在进入搜索模式之前保存内容偏移并在之后恢复它)。
我已经尝试过[RACSignal if: then: else:]
,但没有完全做到。
reactive-cocoa - ReactiveCocoa 的 Kiwi 测试产生 EXC_BAD_ACCESS
我正在尝试使用 Kiwi 框架测试 ReactiveCocoa 代码。
这是代码:
这是测试用例
每次我运行测试用例时,当它尝试添加观察者时,我在 RACKVOTrampoline 类中都有一个 EXC_BAD_ACCESS
有什么建议么?
生产代码可以很好地与 ReactiveCocoa 一起使用。
ios - 如何使用 ReactiveCocoa 影响多个属性?
我想影响多个属性,并且在UIButton
.
我正在尝试推理最好的方法,但可以使用一些输入。
这是我所拥有的:
这行得通,但我很想听听任何建议。
ios - 使用 ReactiveCocoa 时未调用错误块
出于某种原因,我没有收到错误消息。(我在这里简化了代码以直截了当。)
这将打印“B”。知道为什么吗?如果-sendError:
在订阅者上调用,为什么完成块会收到它?