2013-04-02 3 views
7

Я использую UAGitHubEngine для доступа к API GitHub. Я хочу написать функциональное реактивное приложение для получения некоторых данных. Я полагаюсь на код here, чтобы настроить асинхронный запрос сети. То, что я ищу, - это идентификатор команды какой-то команды под названием «Генерал». Я могу сделать фильтрование/печать часть OK:Использование RACCommand с операцией асинхронной сети

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

Но создание команды является для меня загадкой:

self.gitHubCommand = [RACCommand command]; 

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

    return signal; 
}]; 

Как настроить блок сигнала, чтобы вернуть сигнал, который толкает событие, когда возвращается какой-либо асинхронный сетевой вызов?

ответ

4

Ответ был сделан в RACReplaySubject, который AFNetworking uses обернул его асинхронные запросы.

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

С addSignalBlock: возвращает сигнал сигналов, мы должны подписаться на следующий сигнал, который он излучает.

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

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

Наконец, addSignalBlock: блок не выполняется, пока команда не будет выполнена, что мне удалось со следующим:

[self.gitHubCommand execute:[NSNull null]]; 
Смежные вопросы