Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios MKDirections calculateETAWithCompletionHandler:处于后台状态_Ios_Objective C_Mapkit_Objective C Blocks - Fatal编程技术网

Ios MKDirections calculateETAWithCompletionHandler:处于后台状态

Ios MKDirections calculateETAWithCompletionHandler:处于后台状态,ios,objective-c,mapkit,objective-c-blocks,Ios,Objective C,Mapkit,Objective C Blocks,我有一个监控重要位置变化的应用程序。 收到新计算后,我想计算从当前位置到指定位置的持续时间。 要计算持续时间,我使用MKDirections类中的calculateETAWithCompletionHandler:。 只要应用程序在前台,一切都能正常工作 当我将应用程序发送到后台时,它会正确地在后台接收位置更新,并且在我调用calculateETAWithCompletionHandler:之前,一切都正常工作,这将永远不会返回结果 MKDirectionsHandler,calculateET

我有一个监控重要位置变化的应用程序。
收到新计算后,我想计算从当前位置到指定位置的持续时间。
要计算持续时间,我使用
MKDirections
类中的
calculateETAWithCompletionHandler:

只要应用程序在前台,一切都能正常工作

当我将应用程序发送到后台时,它会正确地在后台接收位置更新,并且在我调用
calculateETAWithCompletionHandler:
之前,一切都正常工作,这将永远不会返回结果

MKDirectionsHandler
,calculateETAWithCompletionHandler:的完成处理程序。在后台时从不调用

一旦应用程序再次进入前台,所有等待完成的处理程序都将收到结果

MKMapItem* origin = [MKMapItem mapItemForCurrentLocation];
MKMapItem* destination = [[MKMapItem alloc] initWithPlacemark:destinationPlacemark];

MKDirectionsRequest* request = [MKDirectionsRequest new];
[request setSource:origin];
[request setDestination:destination];
[request setTransportType:MKDirectionsTransportTypeAutomobile];

MKDirections* directions = [[MKDirections alloc] initWithRequest:request];

[directions calculateETAWithCompletionHandler:^(MKETAResponse *response, NSError *error) {
        completion(response.expectedTravelTime, error);
}];
是否不允许在后台调用CompletionHandler:calculateETAWithCompletionHandler?

有什么办法可以解决这个问题吗?

关于
MKDirection
的文档对这个问题不是很具体,我能找到的最相关的部分是:

MKDirections对象为您提供来自Apple服务器的基于路由的方向数据。您可以使用此类的实例根据您提供的mkDirectionRequest对象中的数据获取旅行时间信息或驾驶或行走方向。directions对象将您的请求传递给Apple服务器,并将请求的信息返回给您提供的块

由于您试图计算旅行时间,因此,
calculateETAWithCompletionHandler:
似乎试图向apple服务器执行网络请求。当应用程序处于后台状态时,请求被搁置,直到应用程序再次进入前台


不幸的是,我不认为有一个简单的方法来解决这个问题。您可以尝试使用“猜测”方法,在应用程序进入后台状态之前,它计算用户的ETA,然后在后台,它根据您当前位置与目的地之间的直接距离成比例地增加或减少ETA。根据您希望结果的精确程度,这种广泛的估计可能足以满足您的要求。

我相信您使用mkmaItem的方式是问题所在,您需要在主线程上运行它。所以我不认为它能满足你的需要。在后台收集位置时,您应该使用CoreLocation。

您是否有任何文档说明
MKDirection
请求(或一般的网络请求)在后台状态下被搁置?否,我不知道,但我知道如果你想在后台发出请求,你可以使用NSURLSession进行后台会话,也可以将网络调用打包到后台任务中,根据这个答案:也许你可以尝试在后台任务中包装
calculateETAWithCompletionHandler:
?你可能想要提交一个错误报告。我相信你使用
mkmaItem
的方式是问题所在,你需要在主线程上运行这个。所以我不认为它能满足你的需要。在后台收集位置时,应使用
CoreLocation
。@rmp感谢您的提示。这似乎是解决办法。如果你把它作为一个答案,我会接受的。好的,我会这么做,很高兴它帮助解决了你的问题issue@pre您是否能够找到后台执行“calculateETAWithCompletionHandler:”的解决方案?问题是行
[MKMapItem mapItemForCurrentLocation]
,我不得不直接使用
CLLocationManager
提供的位置。你能发布一些固定的代码吗?我遇到了同样的问题。@在工作中,我的问题是
[MKMapItem-mapItemForCurrentLocation]
。此方法不会在后台返回。在后台使用
CLLocationManager
获取当前位置。@pre谢谢。修正了这个问题。