Also habe ich gerade erst mit ReactiveCocoa angefangen, und ich dachte, der beste Weg zu lernen wäre, einfach hineinzuspringen und den bestehenden Code, den ich habe, umzubauen. Ich wollte etwas Kritik bekommen und sicherstellen, dass ich in die richtige Richtung gehe.Refactoring in ReactiveCocoa
So in der App ich Refactoring bin, habe ich eine Menge Code, der so geht:
[self.ff getArrayFromUri:@"/States?sort=name asc" onComplete:^(NSError *theErr, id theObj, NSHTTPURLResponse *theResponse) {
if(!theErr) {
//do something with theObj
}
else {
//handle the error
}
}];
ich zur Zeit habe dies wie so in ReactiveCocoa Refactoring:
-(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); }
Ist das etwa Wie sollte ich mit dem RAC Subject verfahren oder gibt es einen besseren Weg? Dieses ganze Konzept ist neu für mich, da meine einzigen Programmiersprachen bisher Java und Objective-C waren, so dass mich diese funktionale, reaktive Denkweise ein wenig aus dem Konzept wirft.
Danke für die Antwort, ich weiß es zu schätzen. Ich erhalte ein Problem mit Ihrem bereitgestellten Code, in der vorletzten Probe. '[request catch:]' sagt, dass es ein 'RACSignal' zurückgeben muss und nicht ungültig ist. Fehle ich da gerade etwas? –
Ah, tut mir leid, du hast vollkommen recht. Sie können einfach "[RACSignal empty]" zurückgeben (um anzuzeigen, dass das Fehlersignal durch ein sofort erfolgreiches ersetzt werden soll). Ich werde meine Antwort aktualisieren. –
Ok, also ich habe alles aktualisiert, und es funktioniert, außer ich bekomme eine erhebliche Verzögerung (ca. 3 Sekunden) und auch es scheint den Haupt-Thread blockiert (alle Benutzerinteraktion reagiert nicht) von dem Zeitpunkt an, als ich auf die Schaltfläche tippen wenn 'prepareForSegue: sender:' aufgerufen wird. Wenn ich jedoch "RACSignal starWithScheduler: block" mache und "[RACScheduler mainThreadScheduler]" für den Scheduler übergebe, wird es wie erwartet ausgeführt. Also was fehlt mir hier? Ehrlich gesagt, fühle ich mich durch dieses Zeug wie ein Idiot, vielleicht sollte ich zurück zu "Haskell for pre-K" gehen, bevor ich mich mit diesem Zeug beschäftige. –