1

我想做一个简单的动作,获取本地通知并打开苹果地图应用程序。当我收到通知然后滑动它时,我的应用程序首先打开,这很好。但是我需要等待大约 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];
}
4

3 回答 3

1

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

正如@Yazid 建议的那样,用异步调用包装它,以便您的应用程序可以在单独的线程中启动它的地图集成,同时在主线程上快速恢复自身。一旦完成(这将快得多),您将看到地图打开。但是,我建议使用默认队列而不是主队列(使用主队列可能会出现死锁)。

- (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];
  });
}
于 2014-09-16T10:44:59.517 回答
0

当应用程序获取位置时,您可以添加指标或 MBProgressHUD 之类的东西。如果您不想在屏幕上显示任何内容,您可以添加一个视图出现在地图中,当您加载所有视图时,用动画隐藏此视图

于 2014-01-20T03:23:53.740 回答
0

你可以尝试用这个包装你的代码:

dispatch_async(dispatch_get_main_queue(), ^{
    // Your code here
});
于 2014-05-02T12:59:20.480 回答