在auth的情况下如何链接和组合RACSignals正确?

时间:2014-01-30 21:36:48

标签: ios objective-c reactive-cocoa

我与它战斗了几天,但仍然没有成功,请帮助别人。我希望这个问题很愚蠢) 所以,我有连接社交网络的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];
    }];
}

1 个答案:

答案 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]可能负责构建视图控制器并传递信号。