gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 03:37:48 26 4
gpt4 key购买 nike

我正在用 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com