【问题标题】:ReactiveCocoa, RACCommand show message or execute segue after completedReactiveCocoa、RACCommand 显示消息或完成后执行 segue
【发布时间】:2015-05-18 21:48:36
【问题描述】:

我正在为我的 UI 按钮单击事件使用 RACCommand。我正在使用 MVVM 架构。在我的 ViewModel 我有这个:

@property (strong, nonatomic) RACCommand *executeRegistration;

在“init”里面我有这个:

self.executeRegistration = [[RACCommand alloc] initWithSignalBlock:^RACSignal *(id input)
{
    return  [self executeSearchSignal];
}];

执行搜索信号是这样的:

- (RACSignal *)executeSearchSignal {
return [[[self.services insertUserRegistration]
         registerUserName:self.userName]
         logAll];
}

我的“[self.services insertUserRegistration] registerUserName:self.userName" 是这样的:

 @weakify(self);
return [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber)
{
    @strongify(self);

    Manager *manager = [Manager sharedManager];
    manager._delegate = self;

    RACSignal *successSignal =
    [self rac_signalForSelector:@selector(manager:didSuccesWithoutError:)
                   fromProtocol:@protocol(ManagerDelegate)];

    RACSignal *failSignal =
    [self rac_signalForSelector:@selector(manager:didFailWithError:)
                   fromProtocol:@protocol(ManagerDelegate)];

    [[successSignal map:^id(RACTuple *tuple)
    {
        return tuple.second;
    }] subscribeNext:^(id x) {
        [subscriber sendNext:x];
        [subscriber sendCompleted];
    }];

    [[failSignal map:^id(RACTuple *tuple)
      {
          return tuple.second;
      }] subscribeNext:^(id x) {
          [subscriber sendError:x];
      }];

    [manager insertUserRegistration:name];
    return nil;
}];

我的 ViewController 在 BindViewModel 方法中有这个:

[self.finishRegistrationButton.rac_command.executionSignals subscribeNext:^(RACSignal *loginSignal) {
    // Log a message whenever we log in successfully.
    [loginSignal subscribeCompleted:^{
        NSLog(@"I'm here.");
    }];
}];

self.finishRegistrationButton.rac_command = self.viewModel.executeRegistration;

使用我的“logAll”属性,我可以看到一切都在执行,问题是一切正常后它永远不会进入 subsrcibeCompleted。如果有错误,我想显示错误消息,如果一切正常,我想执行 segue。我究竟做错了什么?你能解释一下如何正确地做到这一点吗?我被困在这里很长一段时间了。

【问题讨论】:

    标签: ios objective-c mvvm reactive-cocoa


    【解决方案1】:

    我做到了。 RACCommand '没有 subscribeError'。发送的信号不包括错误事件。有特殊的属性“错误”。在该属性中,发送错误的每个信号都发送为“下一个”。所以,解决方案是使用这个:

    [self.executeRegistration.executionSignals subscribeNext:^(RACSignal *signal){
    [signal subscribeCompleted:^{
         NSLog(@"Registered");
      }];
    }];
    
    [self.executeRegistration.errors subscribeNext:^(id x) {
        NSLog(@"Error");
    }];
    

    没关系。如果您不想要每个新值,则无需 subscribeNext。这实际上是非常酷的东西,但我读过它太令人困惑了,为什么它不像经典实现那样发送错误(它是给我的 :))。如果我没记错的话,它将包含在 3.0 中。

    【讨论】:

      【解决方案2】:

      self.finishRegistrationButton.rac_command.executionSignals 返回一个信号的信号,所以你会想要使用switchToLatest,像这样:

      self.finishRegistrationButton.rac_command.executionSignals.switchToLatest

      此函数拦截信号并切换到最近接收到的、下一个发送、错误并从该信号而不是操作的信号完成。这对于随时间发送信号的操作非常方便。

      此代码仅适用于拥有单个信号的executionSignals,如果您想要多个目标,那么您将需要一些更复杂的东西。如果您需要更改代码以使其工作,您可能需要查看flattenMap:

      【讨论】:

      • 我的executionSignals.switchToLatest仍然没有去subscribeNext或subscribeError
      • 这很奇怪。如果只是直接使用块返回的信号,它是否按预期发送并完成?在我的代码中使用 switchToLatest 效果很好。
      • 在我的服务实现中,我有一个信号,然后在我的 viewModel 中,我有一个 RACCommand,它具有从服务实现调用信号的信号(我的问题中的第三个代码段)。在我的 viewController 中,我有 RACCommand。所以服务实现中的信号 -> RACCommand 有信号调用服务信号 -> ViewController 按钮 RACCommand
      猜你喜欢
      • 1970-01-01
      • 2023-03-17
      • 1970-01-01
      • 1970-01-01
      • 2013-03-02
      • 2013-08-21
      • 2016-03-19
      • 2011-10-07
      • 1970-01-01
      相关资源
      最近更新 更多