2013-04-02 12 views
7

Używam UAGitHubEngine do uzyskiwania dostępu do interfejsu API GitHub. Chcę napisać funkcjonalną aplikację reaktywną do pobierania niektórych danych. Opieram się na kodzie here, aby skonfigurować asynchroniczne żądanie sieciowe. To, czego szukam, to identyfikator zespołu jakiegoś zespołu o nazwie "General". Mogę zrobić filtrowanie/drukowanie część OK:Użyj polecenia RACCommand z operacją sieci asynchronicznej

[[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); 
}]; 

Ale konfigurowania polecenia jest dla mnie zagadką:

self.gitHubCommand = [RACCommand command]; 

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

    return signal; 
}]; 

Jak mogę skonfigurować blok sygnałowy do powrotu sygnału, który popycha zdarzenie, gdy nastąpi powrót do asynchronicznego połączenia sieciowego?

Odpowiedz

4

Odpowiedź była w RACReplaySubject, którą AFNetworking uses zawijać swoje asynchroniczne żądania.

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; 
}]; 

Od addSignalBlock: powraca sygnał sygnałów, musimy zapisać się do następnego sygnału emituje.

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

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

Wreszcie blok addSignalBlock: nie jest wykonywana, dopóki polecenie jest wykonywane, co udało mi się z następujących czynności:

[self.gitHubCommand execute:[NSNull null]]; 
Powiązane problemy