我对 NSThread 有一个问题,我不太了解..
如何很好地创建一个 NSThread:
- (id)initWithTarget:(id)target selector:(SEL)selector object:(id)argument
然后...
我对 NSThread 和他的所有方法有点困惑。
我想创建一个 NSThread 并每 5 分钟触发一次(当然还要继续使用我的应用程序而不会延迟 :)
我对 NSThread 有一个问题,我不太了解..
如何很好地创建一个 NSThread:
- (id)initWithTarget:(id)target selector:(SEL)selector object:(id)argument
然后...
我对 NSThread 和他的所有方法有点困惑。
我想创建一个 NSThread 并每 5 分钟触发一次(当然还要继续使用我的应用程序而不会延迟 :)
你可以设置一个 NSTimer 来运行一个方法来启动你的线程
// Put in a method somewhere that i will get called and set up.
[NSTimer timerWithTimeInterval:10 target:self selector:@selector(myThreadMethod) userInfo:nil repeats:YES];
或者
[NSTimer scheduledTimerWithTimeInterval:10 target:self selector:@selector(myThreadMethod) userInfo:nil repeats:YES];
您还可以将其设置为 NSTimer,以便您可以设置计时器的功能。比如开始和结束。
- (void)myThreadMethod
{
[NSThread detachNewThreadSelector:@selector(someMethod) toTarget:self withObject:nil];
}
或者使用带有 GCD 的调度源,因为 Apple 建议从NSThread
使用中迁移。
假设存在以下 ivar:
dispatch_source_t _timer;
然后,例如:
dispatch_queue_t backgroundQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
_timer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, backgroundQueue);
dispatch_source_set_timer(_timer, DISPATCH_TIME_NOW, 2 * NSEC_PER_SEC, 0.05 * NSEC_PER_SEC);
dispatch_source_set_event_handler(_timer, ^{
NSLog(@"periodic task");
});
dispatch_resume(_timer);
它将每 2 秒在后台队列上触发一个小任务,并留有很小的余地。
我建议为您的目的使用NSTimer + NSThred
[NSTimer scheduledTimerWithTimeInterval:300 target:self selector:@selector(triggerTimer:)
userInfo:nil repeats:YES];
-(void) triggerTimer:(NSTimer *)theTimer
{
//Here perform the thread operations
[NSThread detachNewThreadSelector:@selector(myThreadMethod) toTarget:self withObject:nil];
}
您可以尝试使用 NSTimer 来实现它。在主线程中注册一个 NSTimer:
NSTimer *timer = [NSTimer scheduledTimerWithTimeInterval:300 target:self selector:@selector(doSomething) userInfo:nil repeats:YES];
你可以让 -doSomething 启动一个线程来完成你的实际工作:
-(void) doSomething {
dispatch_queue_t doThings = dispatch_queue_create("doThings", NULL);
dispatch_async(doThings, ^{
//Do heavy work here...
dispatch_async(dispatch_get_main_queue(), ^{
//Here is main thread. You may want to do UI affair or invalidate the timer here.
});
});
}