【问题标题】:ios: how run location manager in backgroundios:如何在后台运行位置管理器
【发布时间】:2014-02-17 12:09:46
【问题描述】:

我想运行我在函数中所做的一切:

- (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation {
}

在后台。我的页面有很多元素,我希望地图的加载不会阻止应用程序的使用。当应用程序加载时,地图被初始化,用户必须等待几秒钟才能加载地图。我知道我们可以用

在后台做一些事情
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), ^{
    [self doWorkInBackground];
});

但我不使用 locationManager。 所以我希望应用程序在没有地图的情况下加载,当地图完成加载时,它会出现在应用程序上。 你可以帮帮我吗 ? 谢谢。

【问题讨论】:

标签: ios objective-c cllocationmanager background-thread


【解决方案1】:

是的,您应该将代码放在您发布的异步块之间。从块中加载地图后,您可以在视图控制器上调用另一个方法来显示地图。这你必须在主线程中执行,否则你的家伙会搞砸的。

__weak typeof(self) weakSelf = self;    
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        // load your map here
        dispatch_async(dispatch_get_main_queue(), ^{
            [weakSelf mapWasLoaded];
        });
 });

__weak 是为了避免使用块的内存泄漏。

【讨论】:

  • 是的,我知道这种方法,但我希望 locationManager 在加载时在后台或其他线程中运行。例如,我有一个按钮,允许将地图集中在用户的位置上,并将注释放在他周围。不幸的是,加载需要太多时间,所以我希望它在后台加载并在结束时更新地图。
【解决方案2】:

把这个放在 info.plist 文件中

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

对我来说它的工作)

另外,非常好的教程!我从它开始!

Tutorial

【讨论】:

  • 我试过了,还是不行。可以更准确地解释你是如何做到的吗? (例如“整个” info.plist)也许我没有正确地做到这一点。
  • 在 info.plist 中:键 - UIBackgroundModes,类型 - 字符串,值 - 位置。然后我设置 CLocationManager,将其委托设置为 self。当我的应用程序进入后台时 - 它开始做我需要的事情。转到教程链接。你可以在这里找到源代码并检查它是如何工作的。在教程中,您将创建应用程序,该应用程序在后台用地图上的大头针标记您的路线。
猜你喜欢
  • 2012-03-07
  • 2017-03-26
  • 2014-01-29
  • 1970-01-01
  • 1970-01-01
  • 2013-09-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多