2015-10-09 3 views
0

У меня есть текстовое поле поиска, которое предлагает пользователю список предложений автозаполнения, когда он начинает печатать. Пользователь может альтернативно нажать на предложение или нажать кнопку поиска на клавиатуре для выполнения поиска с помощью вводимого текста.ReactiveCocoa - Остановка команды

Может случиться так, что если пользователь начнет печатать, а затем нажимает на поиск до того, как появятся предложения, таблица предложений будет открыта после завершения поиска. Поскольку результат предложений запускается с помощью RACCommand, мне нужен способ остановить такую ​​команду при запуске поиска.

Вот как это делается поиск предложений:

@weakify(self); 
[[[self.searchTextField.rac_textSignal.distinctUntilChanged ignore:@""] throttle:0.5] subscribeNext:^(id x) { 
    @strongify(self); 
    [self.suggestionsViewModel.rac_searchSuggestions execute:self.searchTextField.text]; 
}]; 

[self.suggestionsViewModel.rac_searchSuggestions.executionSignals.flatten 
    subscribeNext:^(id x) { 
     @strongify(self); 
     [self.suggestionsTableView reloadData]; 
     [self viewDidLayoutSubviews]; // Update the suggestions table frame 
}]; 

поиска через текстовое поле запускается с:

- (BOOL)textFieldShouldReturn:(UITextField *)textField { 
    [self.productsViewModel.rac_reloadCommand execute:textField.text]; 
    [textField resignFirstResponder]; 
    return YES; 
} 

Как бы вы перестанете предложения выглядят и тормозят его таблицу перезагружаться?

На основании Cancel RACCommand execution, похоже, что решением будет использование оператора takeUntil. Вот что rac_searchSuggestions, который должен быть перевод «поиск предложений до тех пор, пока продукты поиск начинается»:

self.rac_searchSuggestions = [[RACCommand alloc] initWithSignalBlock:^RACSignal *(id input) { 
    @strongify(self); 
    return [[self rac_getProductsSuggestionsWithParameters:@{@"query":input}] 
      takeUntil:self.productsViewModel.rac_reloadCommand.executionSignal]]; 
}]; 

К сожалению, оператор takeUntil не имеет никакого эффекта.

Большое спасибо, DAN

+0

Возможный дубликат [Отменить выполнение RACCommand] (http://stackoverflow.com/questions/23784097/cancel-raccommand-execution) –

+0

Я забыл добавить часть, где я использую оператор takeUntil см мое редактирование выше. Благодаря! – DAN

ответ

1

Я думаю, что проблема вызвана throttle. Он задерживает next с searchTextField.

  • Если следующее прибытие до нажатия кнопки поиска, все в порядке.
  • Если он прибывает после, то rac_getProductsSuggestionsWithParameters будет выполнен в любом случае.

Таким образом, вам необходимо проверить последнюю ситуацию. Например:

if (self.searchTextField.isFirstResponder) { 
    [self.suggestionsViewModel.rac_searchSuggestions execute:self.searchTextField.text]; 
} 
+0

Он работает, вы рок! – DAN

Смежные вопросы