订阅ReactiveCocoa中的networking电话信号的正确select是什么?
我是ReactiveCocoa
世界的新手,在阅读了ReactiveCocoa的最佳实践之后,我知道我需要"avoid explicit subscriptions and disposal"
但是在所有关于networking和ReactiveCocoa
教程中,我看到了相同的模式:创build信号(使GET
或POST
请求到服务器,parsing结果, sendNext
, sendCompleted
) – > subcsribeNext
(做UI的东西或其他与结果) – > subscribeError
。 所以我们看到这里有一个明确的订阅,我认为这是不好的。
有没有一些更正确和概念上纯洁的方式来做这个共同的事情? rac_liftSelector:withSignals:
或者类似的东西? 或者当我们处理networking调用和AFNetworking
我们应该总是使用这种标准的订阅模式? 详细的解释将是非常有帮助的。
EDITS:
在我的应用程序中,我主要获取调用,其中一些是依赖的,其他人是单一的(绝大多数),如login
或fetchWhatever
,或后postWhatever
。 所有的API调用,我用这样的模式构造( 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]; }
我不使用MVVM
并使用简单的MVC。 在这里,我如何在视图控制器中进行API调用和创build信号:
[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
。 所以我很感兴趣 – 是创build信号和使用它们的简单方法(简单的subscribeNext
)? 或者这可以用一些更正确和优雅的方式来实现?
编辑2:
我看到订阅的主要问题 – 我不知道如何实现与他们的tableview分页。 我有fetchComment
方法加载分页评论 – 每页包含15条评论。 我不能既不使用subcribeNext
也不使用RAC()
绑定,对吗?我怎样才能pipe理这种模式?
networking通话不是特别的,你可以编写发出networking请求的信号,就像你编写任何其他信号一样。