gpt4 book ai didi

ios - 具有后台支持设计问题的位置感知 iOS 应用程序

转载 作者:行者123 更新时间:2023-11-28 22:37:48 24 4
gpt4 key购买 nike

我启用了位置服务,以便在应用程序处于后台时更新位置,并且当应用程序处于前台并显示 map 时,我还会监听位置更新。在 iOS 中设计这种场景的最佳方式应该是什么?我考虑过一些选择:

1) 拥有一个带有 locationManager 成员的类的实例,该成员本身就是它的委托(delegate)。然后,在 didUpdateToLocation 委托(delegate)方法的主体中,类似于:

- (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation
{
if (!background) {
// Perform some processing and notify the view controller which displays the map
// by means of Notification Center
}
else {
appDelegate.bgTask = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:^{
[[UIApplication sharedApplication] endBackgroundTask:appDelegate.bgTask];
appDelegate.bgTask = UIBackgroundTaskInvalid;
}];

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
// Perform some data processing

// Close background task
if (appDelegate.bgTask != UIBackgroundTaskInvalid) {
[[UIApplication sharedApplication] endBackgroundTask:appDelegate.bgTask];
appDelegate.bgTask = UIBackgroundTaskInvalid;
}
});
}
}

(注意:我不确定是否将位置服务启用为后台服务,是否需要像执行有限后台任务一样执行位置处理...)。此类的实例可以是 AppDelegate 的成员,并在进入后台或从显示 map 的 viewModel 调用实例时开始监听位置。因此,AppDelegate 将引用管理 locationManager 的实例,而 map viewController 将引用 AppDelegate,或者也通过以下方式进行通信通知中心的手段。

2) 在 AppDelegate 中直接拥有 locationManager 成员,并且本身就是委托(delegate)。

将de locations监听和管理封装在不同的类中,还是直接在AppDelegate中处理会更好?考虑到我必须能够在前台和后台监听位置并执行一些任务。

提前致谢

最佳答案

我认为您最好的策略是拥有一个作为 locationManager 委托(delegate)的类的单例实例。该实例将负责过滤从 locationManager 返回的任何内容,并最终将位置分配给它的一个属性,我们称它为 myLoc

这解决了位置在获取后需要进行后处理的集中式逻辑问题。

其次,为了让正确的 UIViewControllers 和其他类实例在位置更新时执行它们所需的操作,我建议您在 myLoc 上使用键值观察 (KVO) 。我假设你知道它是如何工作的。我建议使用 KVO 的原因是你需要根据更改的位置触发代码的多个区域的更改,而 KVO 就是为这种模式而设计的。

关于ios - 具有后台支持设计问题的位置感知 iOS 应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15403829/

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