0

我对 NSThread 有一个问题,我不太了解..

如何很好地创建一个 NSThread:

- (id)initWithTarget:(id)target selector:(SEL)selector object:(id)argument

然后...

我对 NSThread 和他的所有方法有点困惑。

我想创建一个 NSThread 并每 5 分钟触发一次(当然还要继续使用我的应用程序而不会延迟 :)

4

4 回答 4

1

你可以设置一个 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];
  }
于 2012-12-07T10:14:00.163 回答
1

或者使用带有 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 秒在后台队列上触发一个小任务,并留有很小的余地。

于 2012-12-07T10:32:17.030 回答
0

我建议为您的目的使用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];
}
于 2012-12-07T10:14:04.747 回答
0

您可以尝试使用 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.
       });
   });
}

您可以参考NSTimer 类GCD了解更多信息。

于 2012-12-07T10:18:39.780 回答