NSTimer的更好替代品

时间:2013-11-28 08:32:36

标签: ios nstimer

我只是想知道,使用比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?

4 个答案:

答案 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(); 

有了这个,你将有一个每秒都会被调用的计划任务,它将不会保留目标(自我),并且如果目标被解除分配,它将自行结束。

来源:NSTimer alternative

答案 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:不要在主线上做 编辑:我看到我得到了投票,但有人可以告诉我这种做法有什么问题吗?