iOS在后台任务上运行异步方法?

时间:2015-09-09 19:30:48

标签: ios asynchronous background-task

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()并且它有效。但它不是采用异步方法。

我在这里缺少什么?我想要完成的任务是否可能?我知道如果我使用同步方法,这将是一件容易的事。

提前致谢。

0 个答案:

没有答案