- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
使用 ReactiveCocoa 2.0,是否有更好的方法来执行以下操作,而无需具体化/取消具体化,并且仍然能够从 3 个信号中的任何一个捕获错误,而无需重复代码?
有 3 个登录按钮。每个都返回一个对应于异步“登录”API 调用的信号。一旦完成,它们将返回用户对象、错误和/或完成。
// Login signals
_loginButton.rac_command = [[RACCommand alloc] initWithEnabled:loginValid signalBlock:^RACSignal *(id input) {
return [[API doLogin:_usernameField.text password:_passwordField.text] materialize];
}];
_fbLoginButton.rac_command = [[RACCommand alloc] initWithSignalBlock:^RACSignal *(id input) {
return [[API doFacebookLogin] materialize];
}];
_twLoginButton.rac_command = [[RACCommand alloc] initWithSignalBlock:^RACSignal *(id input) {
return [[API doTwitterLogin] materialize];
}];
// Login response from any of the 3 signals
[[RACSignal
merge:@[_loginButton.rac_command.executionSignals,
_fbLoginButton.rac_command.executionSignals,
_twLoginButton.rac_command.executionSignals]]
subscribeNext:^(RACSignal *loginSignal) {
RACSignal * s = [loginSignal dematerialize];
[s subscribeNext:^(User *x) {
NSLog(@"user: %@", x);
} error:^(NSError *error) {
NSLog(@"error: %@", error);
} completed:^{
NSLog(@"Completed.");
}];
}];
最佳答案
由于错误会自动转移到 errors
信号,您通常不必自己处理具体化或任何其他事情。事实上,这种(潜在的)复杂性是错误的特殊行为的最初动机。
只需合并错误信号并在一个地方处理它们:
[[RACSignal
merge:@[
_loginButton.rac_command.errors,
_fbLoginButton.rac_command.errors,
_twLoginButton.rac_command.errors,
]]
subscribeNext:^(NSError *error) {
NSLog(@"error: %@", error);
}];
作为旁注,您还可以使用 -flatten
(而不是内部订阅)来简化登录响应的处理:
[[[RACSignal
merge:@[
_loginButton.rac_command.executionSignals,
_fbLoginButton.rac_command.executionSignals,
_twLoginButton.rac_command.executionSignals,
]]
// Flattens the signal of `User` signals by one level. The result is
// one signal of `User`s.
//
// This avoids any need for an inner subscription.
flatten]
subscribeNext:^(User *x) {
// This means that a login request completed as well, so there's no need
// for a separate `completed` block.
NSLog(@"user: %@", x);
}];
关于ios - 将 RACCommand 组合成一个共同结果的最佳方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19867331/
使用 ReactiveCocoa 2.0,是否有更好的方法来执行以下操作,而无需具体化/取消具体化,并且仍然能够从 3 个信号中的任何一个捕获错误,而无需重复代码? 有 3 个登录按钮。每个都返回一个
我一直在研究 MVVM example ,使用 ReactiveCocoa,它是一个 Collection View 中的 App.net 帖子的简单集合,它在到达 Collection View 的
我正在使用 UAGitHubEngine 访问 GitHub 的 API。我想编写一个功能性的响应式(Reactive)应用程序来获取一些数据。我依赖于代码 here设置异步网络请求。我正在寻找的是某
在 MVVM pattern , ViewModel发个RACCommand和 View使用 RACCommand 绑定(bind)按钮,但是如何测试RACCommand ? 我有两个方面需要测试:
我有一个用于保存数据元素数组的 UITableView 的 ViewModel。 UITableView 实现了下拉刷新和无限滚动行为。数据元素是通过 RestKit 从服务器以分页方式请求的,这意味
我如何创建 2 个 RACCommand,以便在另一个执行时禁用一个,并且反之亦然? 像这样, _prevTrackCommand = [[RACCommand alloc] initWithEnab
我将 RACCommand 用于我的 UI 按钮单击事件。我正在使用 MVVM 架构。在我的 ViewModel 中,我有这个: @property (strong, nonatomic) RACCo
我有一个 View 和一个 View 模型。 View 包含一个按钮,每次用户按下它时,我都希望 View Model 得到通知。我还希望在第一个 View 模型收到事件时通知第二个 View 模型。
我是 Reactive Cocoa Framework 的新手,我只是在做一些简单的测试,但我遇到了一个我想了解的问题。 基本上,我只是执行一个 API 调用以从我的服务器获取一个 JSON 对象,我
我学习了很多关于 ReactiveCocoa 的知识但有一件事仍然让我感到困惑:为什么 RACCommand 上的信号 block 本身会返回一个信号? 我了解 RACCommand 的用例、它的 c
我有一个登录按钮,其中分配了一个 RACCommand 来执行登录请求并返回一个用户对象。 我想处理按钮信号错误中的错误。 loginButton.rac_command.executionSigna
我在我的应用程序中使用 ReactiveCocoa 框架来获得使用 MVVM 设计模式的强大功能。 所以对于每个 Controller ,我都有一个 ViewModel。并且Controller绑定(
我是一名优秀的程序员,十分优秀!