我与它战斗了几天,但仍然没有成功,请帮助别人。我希望这个问题很愚蠢) 所以,我有连接社交网络的Class。起初我需要检查 - 我的会话是否有效,我这样做:
self.isSessionValid = [RACSignal combineLatest:
@[RACObserve([FMSettingsManager shared], vkToken),
RACObserve([FMSettingsManager shared], vkUserID),
RACObserve([FMSettingsManager shared], vkExperationDate)]
reduce:^id(NSString* token,NSString* userID, NSDate* experationDate){
return @(token.length > 0 &&
userID.length > 0 &&
experationDate &&
NSOrderedDescending == [experationDate compare:[NSDate date]]);
}];
之后,如果我的会话无效,我需要调用auth,所以我创建了方法。类FMVKAuthorizationVC有一个公共属性,它指示登录过程的当前状态。
- (RACSignal*)authorization
{
RACSignal* shouldStartAuth = [self.isSessionValid not];
[shouldStartAuth map:^id(NSNumber* value)
{
if (value.boolValue)
{
FMVKAuthorizationVC* vc = [FMVKAuthorizationVC new];
FMNavigationController* nc = [[FMNavigationController alloc] initWithRootViewController:vc];
[[[FMScreenManager shared].currentRootController.viewControllers lastObject] presentViewController:nc
animated:YES completion:nil];
return [[RACObserve(vc, state) distinctUntilChanged] map:^id(NSNumber* value)
{
if (value.integerValue == VKAuthStateError)
{
[FMErrorManager showErrorForKey:@"APP_ERROR_VK_AUTH"];
return @(NO);
}
else
{
return @(YES);
}
}];
}
else
{
return @(YES);
}
}];
return shouldStartAuth;
}
之后我需要登录用户,在两种情况下:如果我已经授权并且我的会话有效,或者authoziation已经完成并且我的会话进入有效状态。
我需要在请求开始之前多次调用此授权,我不能使用延迟解决方案:因为如果请求中出错,我需要重新创建它并在另一个调用时再次发送。
- (RACSignal*)loginUser
{
return [[[self authorization] flattenMap:^RACStream *(id value) {
return [self loadUserProfile];
}] flattenMap:^RACStream *(id value) {
return [self loadUserProfilePhoto];
}];
}
答案 0 :(得分:0)
您可以使用-retry
或-retry:
在发生错误后无限次重试或有限次数。
您可能还想将添加的映射返回到shouldStartAuth
,而不是返回shouldStartAuth
。目前你在那里的映射是死代码。
如果您可以访问FMVKAuthorizationVC
的源代码,则可以使用静态方法处理映射的大部分内容并返回信号。也许是这样的:
- (RACSignal*)authorization
{
RACSignal* shouldStartAuth = [self.isSessionValid not];
return [shouldStartAuth
flattenMap:^ RACSignal * (id value)
{
if (value.boolValue)
return [FMVKAuthorizationVC authorizationSignal];
else
return [RACSignal return:@1];
}
}];
}
假设您可以修改该代码, -[FMVKAuthorizationVC authorizationSignal]
可能负责构建视图控制器并传递信号。