NSOperationQueue和Dispatch Queue作为执行重复任务的NSThread的替代

时间:2012-01-05 15:30:06

标签: cocoa nsthread grand-central-dispatch nsoperationqueue

我有一个应用程序,我在后台重复调用方法。我按照以下步骤实现了这一步:

  1. 创建了一个后台线程,
  2. 在创建的线程上调用了适当的方法,
  3. 在线程上调用sleep方法,
  4. 再次调用以前调用的方法。
  5. 以下是我使用的代码:

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

    我已经读过NSThread不是执行后台任务的最佳方法,并且在cocoa中提供了其他类,例如 - NSOperationQueue和GCD,它应优先于NSThread来执行异步任务。所以我试图使用替代类来实现上面指定的功能。

      

    问题是 - 虽然我能够使用执行异步任务   这些类,我无法执行重复性任务(如我的   case)使用这些类

    有人可以对此有所了解并引导我走向正确的方向吗?

3 个答案:

答案 0 :(得分:5)

我认为你会使用你发布的代码获得堆栈溢出(没有双关语)。 -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;
}

答案 1 :(得分:3)

你正在寻找错误的地方。如你所说,NSOperationQueue不适合这类任务。 NSTimer是Cocoa解决这个问题的方法。

答案 2 :(得分:1)

因为问题还有一个大中心派遣标签:
如果您需要根据常规间隔在后台运行某些内容,您还可以使用dispatch_source计时器 Apple在Concurrency Programing Guide中提供了一个非常广泛的示例。

如果您不需要后台线程,可以使用NSTimer(如提到的paulbailey)或更简单: NSObject的performSelector:withObject:afterDelay: