NSOperationQueue и Dispatch Queue как замена NSThread, выполняющего повторяющуюся задачу - PullRequest
2 голосов
/ 05 января 2012

У меня есть приложение, в котором я периодически вызываю метод в фоновом режиме.Я реализовал это, выполнив следующие шаги:

  1. создал фоновый поток,
  2. вызвал соответствующий метод в созданном потоке,
  3. вызвал метод сна в потоке,и
  4. снова вызвал ранее вызванный метод.

Ниже приведен код, который я использовал:

- (void) applicationDidFinishLaunching:(NSNotification *)notification
    [NSApplication detachDrawingThread:@selector(refreshUserIdPassword) toTarget:self withObject:nil];
}

-(void)refreshUserIdPassword
{
    [self getAllUserIdsPasswordsContinousely];
    [NSThread sleepForTimeInterval:180];
    [self refreshUserIdPassword];

}

Я прочитал, что NSThread - не лучший способдля выполнения фоновой задачи, и в какао предусмотрены другие классы, такие как - NSOperationQueue и GCD, которые должны быть предпочтительнее, чем NSThread, для выполнения асинхронной задачи.Поэтому я пытаюсь реализовать указанную выше функциональность, используя альтернативные классы.

Проблема в том, что - хотя я могу выполнить асинхронную задачу, используя эти классы, Я не могу выполнить повторяющиесязадание (как в моем случае) с использованием этих классов .

Может ли кто-нибудь пролить некоторый свет на это и направить меня в правильном направлении?

Ответы [ 3 ]

5 голосов
/ 05 января 2012

Я думаю, вы получите переполнение стека (без каламбура), используя код, который вы разместили.-refreshUserIdPassword бесконечно повторяется ...

Как насчет использования GCD?

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification
{
    // Insert code here to initialize your application
    dispatch_source_t timerSource = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0));
    dispatch_source_set_timer(timerSource, dispatch_time(DISPATCH_TIME_NOW, 0), 180*NSEC_PER_SEC, 10*NSEC_PER_SEC);
    dispatch_source_set_event_handler(timerSource, ^{
        [self getAllUserIdsPasswordsContinuously];
    });
    dispatch_resume(timerSource);
    self.timer = timerSource;
}
3 голосов
/ 05 января 2012

Вы смотрите не в том месте. Как вы говорите, NSOperationQueue не подходит для этого типа задач. NSTimer - это решение проблемы какао.

1 голос
/ 05 января 2012

Поскольку у вопроса также есть тег grand-central-dispatch:
Если вам нужно запустить что-то в фоновом режиме на регулярной основе, вы также можете использовать таймер dispatch_source.
Apple предоставляет очень обширныйпример в Руководство по программированию параллелизма .

Если вам не нужен фоновый поток, вы можете использовать NSTimer (как упомянуто paulbailey) или даже более просто: NSObject's executeSelector: withObject: afterDelay:

...