订阅ReactiveCocoa中的信号以进行网络呼叫的正确选择是什么?

时间:2014-07-04 14:50:39

标签: ios objective-c ios7 afnetworking reactive-cocoa

我是ReactiveCocoa世界的新手,在阅读了ReactiveCocoa here的最佳做法之后,我知道我需要"avoid explicit subscriptions and disposal",但在所有关于网络和{{1}的教程中我看到了相同的模式:创建信号(向服务器发出ReactiveCocoaGET请求,解析结果,POSTsendNext) - > sendCompleted(做UI内容或结果的其他内容) - > subcsribeNext。因此,我们认为这里有一个明确的订阅,这是不好的,我想。

是否有更正确和概念上纯粹的方式来做这个常见的事情? subscribeError或类似的东西?或者当我们处理网络呼叫和rac_liftSelector:withSignals:时,我们应该始终使用此标准订阅模式?详细解释将非常有用。

编辑:

在我的应用程序中,我主要是提取调用,其中一些是依赖的,而另一些是单个(绝大多数),如AFNetworkinglogin,或fetchWhatever。我使用相同的模式构建的所有API调用(postWhatever - 是我的self API manager类,NVMAPI子类):

AFHTTPSessionManager

我没有使用 -(RACSignal*)loginUserWithEmail:(NSString *)email andPassword:(NSString *)password { __block NSURLSessionDataTask* task; return [[RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) { task = [self GET:kUserLoginEndpoint parameters:@{@"email": email, @"password": password} success:^(NSURLSessionDataTask *task, id responseObject) { NVMUser* user = [[NVMUser alloc] initWithDictionary:responseObject[@"user"]]; [subscriber sendNext:user]; [subscriber sendCompleted]; } failure:^(NSURLSessionDataTask *task, NSError *error) { [subscriber sendError:error]; }]; return [RACDisposable disposableWithBlock:^{ [task cancel]; }]; }] replayLazily]; } 并使用简单的MVC。这是我如何在视图控制器中进行API调用和创建信号:

MVVM

我使用的所有信号都是相同的:[SVProgressHUD showWithStatus:@"Processing..." maskType:SVProgressHUDMaskTypeBlack]; [[[NVMAPI api] loginUserWithEmail:self.emailTextField.text andPassword:self.passwordTextField.text] subscribeNext:^(id x) { [self.activeUser setupWithUser:x]; [SVProgressHUD dismiss]; [self performSegueWithIdentifier:kLoginSeque sender:self]; } error:^(NSError *error) { [SVProgressHUD dismiss]; [self showAlertWithText:error.localizedDescription title:@"Error"]; }]; fetchComments等。如果我有从属调用,我会使用postStatus。所以我感兴趣 - 它是一种创建信号和使用它们的正确方法(简单flattenMap)?或者这可以通过一些更正确和优雅的方式来实现?

编辑2:

我看到订阅的主要问题 - 我不知道如何使用它们实现tableview的分页。我有subscribeNext方法和加载分页注释 - 每个页面包含15条注释。我不能同时使用fetchCommentsubcribeNext绑定,对吧?我该如何管理这种模式?

1 个答案:

答案 0 :(得分:2)

网络呼叫并不特殊,您可以像编写任何其他信号一样撰写发出网络请求的信号。