• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

ios - ViewModel 完成操作时 ViewController 中的通知

[复制链接]
菜鸟教程小白 发表于 2022-12-13 15:09:25 | 显示全部楼层 |阅读模式 打印 上一主题 下一主题

我正在制作一个简单的 iOS 应用来学习 ReactiveCocoa。到目前为止,我一直在使用 XIB 文件,但决定切换到 Storyboard 。 在我的第一个 View 中,我有登录屏幕,当用户按下按钮时,viewModel 执行 RACCommand 来验证用户并下载他的联系人列表。之后我需要从 ViewController 调用 performSegueWithIdentifier: 来显示下载的数据。如何在 ViewController 中通知 viewModel 已成功完成其操作?

这是来自 ViewController 的代码片段:

RAC(self.viewModel, username) = self.usernameTextField.rac_textSignal;
RAC(self.viewModel, password) = self.passwordTextField.rac_textSignal;
self.loginButton.rac_command = self.viewModel.executeSignin;

以及来自其 ViewModel 的片段:

////////////////////////////////IN INIT////////////////////////////////////
self.executeSignin =
    [[RACCommand alloc] initWithEnabled:validAuthenticateSignal
                            signalBlock:^RACSignal *(id input) {
                                return  [self executeSigninSignal];
                            }];
//////////////////////////////////////////////////////////////////////////

-(RACSignal *)executpsigninsignal {
    return [[[self.services getAuthenticationService]
             authenticationSignalFor:self.username andPassword:self.password]
            //Return user if exists
            flattenMap:^RACStream *(STUser *user) {
                return [[[[[self services] getContactsLoadService]
                 contactsLoadSignalForUser:user] deliverOn:[RACScheduler mainThreadScheduler]]
                //Return user contacts
               doNext:^(NSArray *contacts) {
                   _downloadedContacts = [NSArray arrayWithArray:contacts];
               }];

            }];
}

我还尝试在 ViewController 中观察 ViewModels 下载的联系人属性:

RACSignal *contactsLoadSignal = RACObserve(self.viewModel, downloadedContacts);
[[contactsLoadSignal filter:^BOOL(NSArray *value) {
    return value!=nil && value.count>0;
}]subscribeNext:^(NSArray *array) {
    [self performSegueWithIdentifier"pushContactsList" sender:self];
}];

但这似乎不起作用,而且看起来并不好看。



Best Answer-推荐答案


您可以使用命令的 executionSignals 属性来做到这一点:

@weakify(self)
[executeSignin.executionSignals.switchToLatest filter:^BOOL(NSArray *value) {
    return value.count>0;  //nil check was redundant here
}] subscribeNext:^(NSArray *array) {
    @strongify(self)
    [self performSegueWithIdentifier"pushContactsList" sender:self];
}];

关于ios - ViewModel 完成操作时 ViewController 中的通知,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35901825/

回复

使用道具 举报

懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关注0

粉丝2

帖子830918

发布主题
阅读排行 更多
广告位

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap