ios – 在Objective – C中的另一个线程中的计时器

我必须定义应该以一定的时间间隔定期调用方法.我需要在另一个线程(非主线程)中调用它,因为此方法用于从外部API获取信息并在核心数据中同步数据.

如何定义此方法以不阻止主线程?

解决方法

除非您特别需要计时器,否则您可以使用Grand Central dispatch.

以下代码段将在认优先级并发队列(即后台线程)上2秒后执行一个块.如果您认为合适,可以更改队列的优先级,但除非您在并发队列上处理大量不同的操作,否则认就足够了.

double delayInSeconds = 2.0;
dispatch_time_t popTime = dispatch_time(disPATCH_TIME_Now,(int64_t)(delayInSeconds * NSEC_PER_SEC));

dispatch_after(popTime,dispatch_get_global_queue(disPATCH_QUEUE_PRIORITY_DEFAULT,0),^(void){
    // Your code here
});

如果您想重复调用它,则可以使用dispatch_source_set_timer设置重复执行.它的主旨如下:

// Create a dispatch source that'll act as a timer on the concurrent queue
// You'll need to store this somewhere so you can suspend and remove it later on
dispatch_source_t dispatchSource = dispatch_source_create(disPATCH_SOURCE_TYPE_TIMER,0)); 

// Setup params for creation of a recurring timer
double interval = 2.0;
dispatch_time_t startTime = dispatch_time(disPATCH_TIME_Now,0);
uint64_t intervalTime = (int64_t)(interval * NSEC_PER_SEC);
dispatch_source_set_timer(dispatchSource,startTime,intervalTime,0);

// Attach the block you want to run on the timer fire
dispatch_source_set_event_handler(dispatchSource,^{
    // Your code here
});

// Start the timer
dispatch_resume(dispatchSource);

// ----

// When you want to stop the timer,you need to suspend the source
dispatch_suspend(dispatchSource);

// If on iOS5 and/or using MRC,you'll need to release the source too
dispatch_release(dispatchSource);

相关文章

UITabBarController 是 iOS 中用于管理和显示选项卡界面的一...
UITableView的重用机制避免了频繁创建和销毁单元格的开销,使...
Objective-C中,类的实例变量(instance variables)和属性(...
从内存管理的角度来看,block可以作为方法的传入参数是因为b...
WKWebView 是 iOS 开发中用于显示网页内容的组件,它是在 iO...
OC中常用的多线程编程技术: 1. NSThread NSThread是Objecti...