我有一个应用程序,我在后台重复调用方法。我按照以下步骤实现了这一步:
以下是我使用的代码:
- (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)使用这些类。
有人可以对此有所了解并引导我走向正确的方向吗?
答案 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: