ios - 为什么信号在 ReactiveCocoa 中被调用两次?

标签 ios objective-c reactive-programming reactive-cocoa

我正在用 https://github.com/ReactiveCocoa/ReactiveCocoa 实现我的第一个代码.

用于登录用户。 [subscriber sendNext:user]; 行被调用了两次,但我希望只有一次。并且根本不调用 map (因此从不调用自动登录)

这是我的实现:

-(RACSignal *) login:(NSString *)email pwd:(NSString *)pwd
{
    DDLogInfo(@"Login user %@", email);

    RACSignal *login = [RACSignal createSignal:^ RACDisposable *(id<RACSubscriber> subscriber)
    {        
        [PFUser logInWithUsernameInBackground:email password:pwd block:^(PFUser *user, NSError *error) {

            if (error) {
                [subscriber sendError:error];
            } else {
                [subscriber sendNext:user];

                [subscriber sendCompleted];
            }
        }];

        return nil;
    }];

    [login map:^(PFUser *user) {
        return [self autoLogin:user];
    }];

    return login;
}

这样调用:

NSString *email = data[@"email"];
NSString *pwd = data[@"pwd"];
[SVProgressHUD showWithMaskType:SVProgressHUDMaskTypeBlack];

RACSignal *login = [[SyncEngine server] login:email pwd:pwd];

[login
 subscribeCompleted:^
{
    [[NSNotificationCenter defaultCenter]
     postNotificationName:NOTIFY_LOGIN_CHANGED
     object:self];

     [SVProgressHUD showSuccessWithStatus:LOC_OK];


     [self cancelForm];
}];

[login
 subscribeError:^(NSError *error)
{
    [SVProgressHUD dismiss];

    [AppUrls alertError:LOC_ERROR_LOGING msg:error.userInfo[@"error"]];
}];

最佳答案

发生这种情况是因为传递给 +[RACSignal createSignal:] 的 block 会在订阅信号时执行,并且您的代码会创建两个单独的订阅:

[login subscribeCompleted:^{ ... }];

[login subscribeError:^(NSError *error) { ... }];

如果只想创建单个订阅,请使用方法 -[RACSignal subscribeError:completed:]:

[login subscribeError:^(NSError *error) {
        [SVProgressHUD dismiss];

        [AppUrls alertError:LOC_ERROR_LOGING msg:error.userInfo[@"error"]];
    }
    completed:^{
        [[NSNotificationCenter defaultCenter]
         postNotificationName:NOTIFY_LOGIN_CHANGED
         object:self];

         [SVProgressHUD showSuccessWithStatus:LOC_OK];


         [self cancelForm];
    }];

关于ios - 为什么信号在 ReactiveCocoa 中被调用两次?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20275570/

相关文章:

ios - 如何在iOS swift中实现评论和回复系统

iphone - UIButton - 框架和边界零 - 基于页面的应用程序

ios - Cordova 远程 ios 构建失败,出现 macincloud 错误 :65

objective-c - 我的对象范围有问题吗?

objective-c - IOKit IOPowerSources 的麻烦

python - 是否有像 Mobx for Python 这样的响应式(Reactive)状态库?

ios - 禁用 iOS 键盘中的空格键

swift - 如何在 ReactiveSwift 中将 Signal 和 SignalProducer 合并到 Signal 中?

c# - 构建 RX 运算符以将键值对的一个可观察值拆分为多个可观察值,每个不同的键一个

ios - 如何在 Objective c 中动态设置 UILabel 高度?