我只是想知道,使用比NSTimer更好,更有效的功能吗?我的ViewDidLoad函数有一个像这样的NSTimer代码:
[NSTimer scheduledTimerWithTimeInterval:900.0f target:self selector:@selector(methodToRun) userInfo:nil repeats:YES];
使用函数methodToRun:
-(void)methodToRun {
if(currentTime == presetTime) {
//do something
}
}
这样可以正常但问题是,这会占用大量内存并且我会收到内存警告。那么,什么是更好,更有效和更少内存消耗的方法来连续触发我的methodToRun以检查currentTime是否等于presetTime?
答案 0 :(得分:10)
您可以使用dispatch_after
。
可以通过使用dispatch_after方法和指向self的弱指针来实现对此的替代解决方案。
__weak id weakSelf = self;
__block void (^timer)(void) = ^{
double delayInSeconds = 1.0;
dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, delayInSeconds * NSEC_PER_SEC);
dispatch_after(popTime, dispatch_get_main_queue(), ^(void){
id strongSelf = weakSelf;
if (!strongSelf) {
return;
}
// Schedule the timer again
timer();
// Always use strongSelf when calling a method or accessing an iVar
[strongSelf doSomething];
strongSelf->anIVar = 0;
});
};
// Start the timer for the first time
timer();
有了这个,你将有一个每秒都会被调用的计划任务,它将不会保留目标(自我),并且如果目标被解除分配,它将自行结束。
答案 1 :(得分:4)
根据@ Anoop的答案,这里的答案很快:
func timerGCD() -> ()
{
weak var weakSelf = self
dispatch_after(
dispatch_time(
DISPATCH_TIME_NOW,
Int64(1.0 * Double(NSEC_PER_SEC))
),
dispatch_get_main_queue())
{
if let strongSelf = weakSelf
{
// Always use strongSelf when calling a method or accessing an iVar
strongSelf.doSomething()
// Schedule the timer again
strongSelf.timerGCD()
}
}
}
然后只需启动它:
timerGCD()
答案 2 :(得分:0)
使用可选链接和弱自我的更好的快速版本
func timerGCD() -> ()
{
dispatch_after(
dispatch_time(
DISPATCH_TIME_NOW,
Int64(1.0 * Double(NSEC_PER_SEC))
),
dispatch_get_main_queue())
{ [weak self] in
self?.doSomething()
// Schedule the timer again
self?.timerGCD()
}
}
答案 3 :(得分:-6)
只需运行while循环,并在循环结束时使用sleep()
或usleep()
函数来定义时间间隔。
PS:不要在主线上做
编辑:我看到我得到了投票,但有人可以告诉我这种做法有什么问题吗?