菜鸟教程小白 发表于 2022-12-13 15:09:25

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


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

<p>这是来自 ViewController 的代码片段:</p>

<pre><code>RAC(self.viewModel, username) = self.usernameTextField.rac_textSignal;
RAC(self.viewModel, password) = self.passwordTextField.rac_textSignal;
self.loginButton.rac_command = self.viewModel.executeSignin;
</code></pre>

<p>以及来自其 ViewModel 的片段:</p>

<pre><code>////////////////////////////////IN INIT////////////////////////////////////
self.executeSignin =
    [ initWithEnabled:validAuthenticateSignal
                            signalBlock:^RACSignal *(id input) {
                              return;
                            }];
//////////////////////////////////////////////////////////////////////////

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

            }];
}
</code></pre>

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

<pre><code>RACSignal *contactsLoadSignal = RACObserve(self.viewModel, downloadedContacts);
[[contactsLoadSignal filter:^BOOL(NSArray *value) {
    return value!=nil &amp;&amp; value.count&gt;0;
}]subscribeNext:^(NSArray *array) {
    ;
}];
</code></pre>

<p>但这似乎不起作用,而且看起来并不好看。</p></p>
                                    <br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
                                            <p><p>您可以使用命令的 <code>executionSignals</code> 属性来做到这一点:</p>

<pre><code>@weakify(self)
[executeSignin.executionSignals.switchToLatest filter:^BOOL(NSArray *value) {
    return value.count&gt;0;//nil check was redundant here
}] subscribeNext:^(NSArray *array) {
    @strongify(self)
    ;
}];
</code></pre></p>
                                   
                                                <p style="font-size: 20px;">关于ios - ViewModel 完成操作时 ViewController 中的通知,我们在Stack Overflow上找到一个类似的问题:
                                                        <a href="https://stackoverflow.com/questions/35901825/" rel="noreferrer noopener nofollow" style="color: red;">
                                                                https://stackoverflow.com/questions/35901825/
                                                        </a>
                                                </p>
                                       
页: [1]
查看完整版本: ios - ViewModel 完成操作时 ViewController 中的通知