Я новичок в NSOperationQueue, но в текущем проекте мне нужен способ отменить асинхронную операцию, когда он истекает. В моем исходном коде используется GCD и работает. Вот оно:NSOperationQueue, кажется, замедляет производительность
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0),^{
rg = [[RiverGauge alloc] initWithStationInfo:[station id] forHistoryInHours:48 inThisFormat:nil];
dispatch_async(dispatch_get_main_queue(), ^{
[hud removeFromSuperview];
UIStoryboard *sb = [UIStoryboard storyboardWithName:@"Main" bundle:nil];
GaugeViewController *vc = [sb instantiateViewControllerWithIdentifier:@"GaugeDetailViewController"];
[vc setRiverGauge:rg];
[self.navigationController pushViewController:vc animated:YES];
});
});
RiverGauge это сетевая операция, которая может занять много времени, особенно если пользователь находится в сельской местности. Большинство сообщений, которые я видел, предлагают переместить это в NSOperationQueue. Я сделал это следующим образом:
NSOperationQueue *queue = [NSOperationQueue new];
NSInvocationOperation *op = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(getGaugeDetail:) object:[station id]];
[queue addOperation:op];
В методе getGaugeDetail (в параметре селектора) У меня есть следующий код:
RiverGauge *rg = [[RiverGauge alloc] initWithStationInfo:gaugeIdentifier forHistoryInHours:48 inThisFormat:nil];
UIStoryboard *sb = [UIStoryboard storyboardWithName:@"Main" bundle:nil];
GaugeViewController *vc = [sb instantiateViewControllerWithIdentifier:@"GaugeDetailViewController"];
[vc setRiverGauge:rg];
[self.navigationController pushViewController:vc animated:YES];
При выполнении этой операции с помощью НОД, он реагирует быстро с быстрым интернет-соединение. Однако при использовании NSOperationQueue одна и та же операция занимает несколько секунд. Однако возвращенные данные точны. Опять же, я не очень хорошо знаком с NSOperationQueue. Какие-либо предложения?
Спасибо!
Я бы добавил, что вы должны убедиться, что операция выполняется на фоновом потоке. –
Итак, моя дилемма продолжается. Мне нужно только отменить операцию, если она истечет, и именно поэтому я пытаюсь переключиться на NSOperation, так как она, видимо, может быть отменена. Кажется, я здесь в Catch 22. – Pheepster
Обратите внимание, что поддержка отмены NSOperation фактически не отменяет выполняемые операции. Он просто устанавливает «isCancelled» на «да», что ваша операция может проверить, и предотвращает запуск операции, если она еще не была выполнена. Нет ничего особенного в том, что он делает для вас. –