2013-04-02 6 views
7

Ich verwende UAGitHubEngine, um auf die API von GitHub zuzugreifen. Ich möchte eine funktionale reaktive App schreiben, um einige Daten zu holen. Ich verlasse mich auf den Code here, um eine asynchrone Netzwerkanforderung einzurichten. Was ich suche ist die Team ID eines Teams namens "General". Ich kann die Filter-/Druckteil OK tun:RACCommand mit asynchronem Netzwerkbetrieb verwenden

[[self.gitHubSignal filter:^BOOL(NSDictionary *team) { 
    NSString *teamName = [team valueForKey:@"name"]; 
    return [teamName isEqualToString:@"General"]; 
}] subscribeNext:^(NSDictionary *team) { 

    NSInteger teamID = [[team valueForKey:@"id"] intValue]; 

    NSLog(@"Team ID: %lu", teamID); 
}]; 

aber den Befehl Einrichtung ist mir ein Rätsel:

self.gitHubCommand = [RACCommand command]; 

self.gitHubSignal = [self.gitHubCommand addSignalBlock:^RACSignal *(id value) { 
    RACSignal *signal = ??? 

    return signal; 
}]; 

Wie stelle ich den Signalblock auf ein Signal zurück, das ein schiebt Ereignis, wenn ein asynchroner Netzwerkaufruf zurückkehrt?

Antwort

4

Die Antwort war in RACReplaySubject, die AFNetworking uses seine asynchronen Anforderungen umhüllen.

self.gitHubCommand = [RACCommand command]; 

self.gitHubSignals = [self.gitHubCommand addSignalBlock:^RACSignal *(id value) { 
    RACReplaySubject *subject = [RACReplaySubject subject]; 

    [engine teamsInOrganization:kOrganizationName withSuccess:^(id result) { 

     for (NSDictionary *team in result) 
     { 
      [subject sendNext:team]; 
     } 

     [subject sendCompleted];    
    } failure:^(NSError *error) { 
     [subject sendError:error]; 
    }]; 

    return subject; 
}]; 

Da addSignalBlock: kehrt ein Signal von Signalen, müssen wir es aussendet, auf das nächste Signal abonnieren.

[self.gitHubSignals subscribeNext:^(id signal) { 
    [signal subscribeNext:^(NSDictionary *team) { 
     NSInteger teamID = [[team valueForKey:@"id"] intValue]; 

     NSLog(@"Team ID: %lu", teamID); 
    }]; 
}]; 

Schließlich wird der addSignalBlock: Block wird nicht ausgeführt, bis der Befehl ausgeführt wird, die ich mit den folgenden verwaltet:

[self.gitHubCommand execute:[NSNull null]]; 
Verwandte Themen