当关闭视图启动位置服务通知错误发生时

Posted

技术标签:

【中文标题】当关闭视图启动位置服务通知错误发生时【英文标题】:When close view that started locations service notification error occure 【发布时间】:2014-05-29 18:37:26 【问题描述】:

我创建了以这个项目为核心的小应用程序:https://github.com/dsdavids/TTLocationHandler 它运行良好,直到我从应用程序中的另一个视图移出声明位置服务。应用程序在做什么:当它启动时,您可以点击开始按钮和(在模拟器中的位置必须启用)地图上的移动路线会在您移动时显示。 当我在第二个视图中移动开始操作时,问题就出现了。 在第二个视图中,我只想启动定位服务并关闭它。 问题是当我开始在第二个视图上定位时,出现错误(应用程序崩溃EXC_BAD):

TTLocationHandler
...
dispatch_async(dispatch_get_main_queue(), ^
        if (OUTPUT_LOGS) NSLog(@"Sending notification out");
        NSNotification *aNotification = [NSNotification notificationWithName:LocationHandlerDidUpdateLocation object:[locationToSave copy]];
        [[NSNotificationCenter defaultCenter] postNotification:aNotification];
    );
...

我认为这是因为我关闭了第二个视图(启动服务的视图)并且TTLocationHandler 仍然试图向它发送一些东西。 为了更好地理解我的问题,我在 git hub 添加了项目:https://github.com/1110/common-location-features 您可以下载它并从第二个视图运行启动服务,当关闭该视图应用程序将在几秒钟内崩溃。

如果有人能抽出一点时间告诉我我在这里做错了什么,我将非常感激,因为我确信这是我可能做错的一些小事。 整个代码在SecondViewController.m

谢谢

【问题讨论】:

【参考方案1】:

问题可能是位置管理器正在向不再存在的对象发送位置更新。

我没有时间深入研究您的所有代码,但一般来说,一旦您将位置管理器告知startUpdatingLocation,您需要保留您的位置管理器委托对象,直到您告诉它停止。如果您所说的“第二个视图”是您的委托对象,那么在您告诉位置管理器stopUpdatingLocation 之前,您不能让该视图被释放。

一般来说,您希望拥有一个对象是CLLocationManagerDelegate,并在您需要时保留该对象。每次位置更改时,代理都会收到通知,并且代理有责任更新任何关心该位置的视图。

【讨论】:

是的,我明白了。如果我的主要观点(从未解除分配)一切正常。但是,如果在启动位置服务位置管理器后我解雇了第二个视图,则尝试向“其创建者”发送一些东西。我的问题是我必须从该视图运行定位服务,启动定位服务后该视图将被关闭。有没有其他方法可以做到这一点?可能有一些模式,但不知道:( 把你的第二个视图之外的东西变成CLLocationManagerDelegate - 任何对象都可以是一个委托。我建议让您的主视图包含位置管理器对象并成为它的代表。将指向该对象的指针传递到第二个视图,然后您可以使用指向主视图及其位置管理器的指针从那里做任何您需要做的事情。 根据您的评论,我创建了一个 singleton 类并在其中运行定位服务,它现在可以工作,但我不知道这是一个很好的解决方案,我想尝试使用 pointer解决方案。你能添加一些关于如何将指针传递给第二个视图的代码吗?我想这将是第二个视图中对第一个视图中对象的引用。

以上是关于当关闭视图启动位置服务通知错误发生时的主要内容,如果未能解决你的问题,请参考以下文章

在启动时在iOS中启动位置感知后台服务

UIImagePickerController 不会停止位置服务

当大量磁盘活动发生时如何使 Linux GUI “可用”

Pyads 读取通知值:当 TwinCat 循环发生时

打盹模式停止了定位服务

编辑时的春季启动通知