gpt4 book ai didi

ios - 在ios中设置一个定时器

转载 作者:行者123 更新时间:2023-11-29 11:09:07 25 4
gpt4 key购买 nike

我有一个在后台运行的应用程序,我想在进入后台模式 30 分钟后停止所有定位服务。

所以在我的后台函数中,我这样做:

// 1800 sec = 30 min * 60 sec.
NSDate *date30min = [[NSDate alloc] initWithTimeIntervalSinceNow:1800.0];
NSLog(@"Date30min : %@", date30min);

self.timer = [[NSTimer alloc] initWithFireDate:date30min interval:1 target:self selector:@selector(stopLocation) userInfo:nil repeats:NO];

我的 stopLocation 函数是:

- (void)stopLocation
{
NSLog(@"[My APP] [PASS INTO stopLocation]");
[self.locationManager stopMonitoringSignificantLocationChanges];
[self.locationManager stopUpdatingLocation];
[self.locationManager stopUpdatingHeading];
}

但是我的计时器从不调用该函数,请问我的错误是什么?(我的函数已正确实现到我的 .h 和 .m 文件中,我在后台函数中对此进行了测试。

请帮忙..

最佳答案

忘记将计时器添加到运行循环(在本例中)不是问题。

当您的应用进入后台时,

NSTimer 对象不会触发。因此,如果您想在后台运行 30 分钟后执行某些操作,我会使用另一种技术。

例如,稍后使用后台任务运行您的stopLocation方法:

- (void)applicationDidEnterBackground:(UIApplication *)application {       

__block UIBackgroundTaskIdentifier bgTask = [application beginBackgroundTaskWithExpirationHandler: ^{
NSLog(@" expiration handler!");
}];

dispatch_after(dispatch_time(DISPATCH_TIME_NOW, 30 * 60 * NSEC_PER_SEC), dispatch_get_current_queue(), ^{

[self stopLocation];

// we're done with this task now
[application endBackgroundTask: bgTask];
bgTask = UIBackgroundTaskInvalid;
});
}

当然,你还需要声明:

<key>UIBackgroundModes</key>
<array>
<string>location</string>
</array>

在您的 Info.plist 文件中,但我假设您已经弄明白了。

关于ios - 在ios中设置一个定时器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12307028/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com