我是ReactiveCocoa
世界的新手,在阅读了ReactiveCocoa here的最佳做法之后,我知道我需要"avoid explicit subscriptions and disposal"
,但在所有关于网络和{{1}的教程中我看到了相同的模式:创建信号(向服务器发出ReactiveCocoa
或GET
请求,解析结果,POST
,sendNext
) - > sendCompleted
(做UI内容或结果的其他内容) - > subcsribeNext
。因此,我们认为这里有一个明确的订阅,这是不好的,我想。
是否有更正确和概念上纯粹的方式来做这个常见的事情? subscribeError
或类似的东西?或者当我们处理网络呼叫和rac_liftSelector:withSignals:
时,我们应该始终使用此标准订阅模式?详细解释将非常有用。
编辑:
在我的应用程序中,我主要是提取调用,其中一些是依赖的,而另一些是单个(绝大多数),如AFNetworking
或login
,或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条注释。我不能同时使用fetchComment
和subcribeNext
绑定,对吧?我该如何管理这种模式?
答案 0 :(得分:2)
网络呼叫并不特殊,您可以像编写任何其他信号一样撰写发出网络请求的信号。