Stack Overflow。这是我正在处理的事情。
我正在开发一个iOS 8应用,它会在使用startMonitoringSignificantLocationChanges()
终止应用时开始监控重要的位置更改。直到这里一切正常。该应用在使用application:didFinishLaunchingWithOptions:
进行位置更改时重新启动。我配置了一个CLLocationManager
对象并获得了像Apple参考中所述的CLLocation
:
如果您启动此服务并且您的应用随后被终止,则 如果是新的,系统会自动将应用重新启动到后台 事件到了。在这种情况下,选项字典传递给了 应用程序:willFinishLaunchingWithOptions:和 application:didFinishLaunchingWithOptions:你的应用程序的方法 delegate包含密钥UIApplicationLaunchOptionsLocationKey 表示您的应用因位置事件而启动。上 重新启动,您仍然必须配置位置管理器对象并调用 此方法继续接收位置事件。当你重新启动 位置服务,当前事件将传递给您的代理人 立即。此外,您所在位置的位置属性 管理器对象甚至填充了最新的位置对象 在开始定位服务之前。
就像我说的,这很有效。我的问题是当我尝试使用异步方法从Web服务(如带有TwitterKit
的Twitter API)获取数据时;我只是没有进入完成处理程序。我正在研究很多关于这个主题的内容,我读到了我使用的方法显然是在自己的主题中运行。
以下是我如何收听位置更改启动并创建后台任务:
var locationManager: CLLocationManager!
var bgTaskId: UIBackgroundTaskIdentifier!
func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
// API keys configuration
if let options = launchOptions {
if options[UIApplicationLaunchOptionsLocationKey] != nil {
self.bgTaskId = UIApplication.sharedApplication().beginBackgroundTaskWithExpirationHandler({ () -> Void in
UIApplication.sharedApplication().endBackgroundTask(self.bgTaskId)
self.bgTaskId = UIBackgroundTaskInvalid
})
// Location manager configuration
// Async func
theAsyncRequest(){ (response) -> Void in
//
// NEVER GETS HERE
//
UIApplication.sharedApplication().endBackgroundTask(self.bgTaskId)
self.bgTaskId = UIBackgroundTaskInvalid
}
}
return true
}
// Some code when app launches the normal way
return true
}
我尝试使用像 Parse Framework 这样的同步方法。 let objects = someQuery.findObjects()
并且它有效。但它不是采用异步方法。
我在这里缺少什么?我想要完成的任务是否可能?我知道如果我使用同步方法,这将是一件容易的事。
提前致谢。