在didReceiveLocalNotification下慢慢打开地图应用程序

时间:2014-01-20 02:33:38

标签: ios localnotification mkmapitem

我想做一个简单的操作,获取本地通知并打开苹果地图应用。 当我收到通知然后滑动它时,我的应用程序首先打开,这很好。但我需要等待大约10秒钟才能打开地图应用程序。为什么会延迟?它应该是我的应用程序打开,然后地图直接。

- (void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification
{
  CLLocationCoordinate2D rdOfficeLocation = CLLocationCoordinate2DMake(latitude,longitude);
  MKPlacemark *placemark = [[MKPlacemark alloc] initWithCoordinate:rdOfficeLocation addressDictionary:nil];
  MKMapItem *item = [[MKMapItem alloc] initWithPlacemark:placemark]; 
  [item openInMapsWithLaunchOptions:nil];
}

3 个答案:

答案 0 :(得分:1)

我自己一直遇到这个问题,不是使用地图,而是使用自定义网址方案深度链接到其他应用。问题是,当您告诉它切换到地图时,您的应用尚未完成恢复。这导致10秒延迟。如果您进行调试,您可能会发现didReceiveLocalNotification正在执行并在您调用Maps时挂起一段时间。然后在调用完成后,它仍然必须在AppDelegate中执行applicationDidBecomeActive。

正如@Yazid建议的那样,用异步调用将其包装起来,这样你的应用就可以在一个单独的线程中触发它的Maps集成,同时在主线程上快速恢复。一旦完成(速度会快得多),您将看到地图打开。但是我建议使用默认队列而不是主队列(你可以使用主队列获得死锁)。

- (void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification {
{
  dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
    CLLocationCoordinate2D rdOfficeLocation = CLLocationCoordinate2DMake(latitude,longitude);
    MKPlacemark *placemark = [[MKPlacemark alloc] initWithCoordinate:rdOfficeLocation addressDictionary:nil];
    MKMapItem *item = [[MKMapItem alloc] initWithPlacemark:placemark]; 
    [item openInMapsWithLaunchOptions:nil];
  });
}

答案 1 :(得分:0)

当app获取位置时,您可以添加指标或MBProgressHUD等内容。如果您不想在屏幕上显示任何内容,您可以添加一个显示在地图中的视图,当您加载时,全部用​​动画隐藏此视图

答案 2 :(得分:0)

您可以尝试使用以下代码包装代码:

dispatch_async(dispatch_get_main_queue(), ^{
    // Your code here
});