Итак, я совсем недавно начал работать с ReactiveCocoa и решил, что лучший способ научиться — просто сразу же начать рефакторинг некоторого существующего кода. Я хотел получить некоторую критику и убедиться, что я двигаюсь в правильном направлении.
Итак, в приложении, которое я рефакторинг, у меня есть тонна кода, который выглядит следующим образом:
[self.ff getArrayFromUri:@"/States?sort=name asc" onComplete:^(NSError *theErr, id theObj, NSHTTPURLResponse *theResponse) {
if(!theErr) {
//do something with theObj
}
else {
//handle the error
}
}];
В настоящее время я реорганизовал это в ReactiveCocoa следующим образом:
-(void)viewDidLoad {
//ReactiveCocoa
RACCommand *command = [RACCommand command];
RACSubject *subject = [RACSubject subject];
[[[command addSignalBlock:^RACSignal *(id value) {
NSError *err;
NSArray *array = [self.ff getArrayFromUri:@"/States" error:&err];
err ? [subject sendError:err] : [subject sendNext:array];
return [RACSignal empty];
}]switchToLatest]deliverOn:[RACScheduler mainThreadScheduler]];
[subject subscribeNext:^(NSArray *x) {
[self performSegueWithIdentifier:kSomeSegue sender:x];
} error:^(NSError *error) {
NSLog(@"the error = %@", error.localizedDescription);
}];
self.doNotLocation = [UIButton buttonWithType:UIButtonTypeCustom];
[self.doNotLocation setBackgroundImage:[UIImage imageNamed:@"BlackButton_small.png"] forState:UIControlStateNormal];
[[self.doNotLocation rac_signalForControlEvents:UIControlEventTouchUpInside] executeCommand:command];
RAC(self.doNotLocation.enabled) = RACAbleWithStart(command, canExecute);
RAC([UIApplication sharedApplication],networkActivityIndicatorVisible) = RACAbleWithStart(command, executing); }
Это о том, как я должен это делать, используя RACSubject, или есть лучший способ? Вся эта концепция нова для меня, так как моими единственными языками программирования до сих пор были Java и Objective-C, так что этот функциональный реактивный способ мышления немного сбивает меня с толку.