我正在Swift中编写应用程序,我已经通过singleton class实现了Moscapsule处理数据检索。
当我通知我的应用有content-available: 1
的新数据时,正确的功能会被调用,我目前只在这里做
let mqtt = MQTTManager.Instance
completionHandler(UIBackgroundFetchResult.NewData)
管理器在init上创建连接,onMessageCallback然后使用新数据。
如果应用程序最近运行,是在后台并且单例类保持网络连接,这是有效的。但这不是正确的方法。
我是iOS和Swift开发的新手,我怎么能等待最长的时间?当数据进来时,我可以发送UIBackgroundFetchResult.NewData,如果什么都没有,我可以发送UIBackgroundFetchResult.Failed。
我的第一个想法是编写一个循环来检查该类中的变量,如果每隔500毫秒发出一条新消息,如果是,则调用completionHandler。但这对我来说并不合适,所以,你会做什么?
编辑2015/02/18: 下面是我的AppDelegate.swift中的代码,一旦应用程序收到静默推送通知,就会执行该代码:
func application(application: UIApplication, didReceiveRemoteNotification userInfo: [NSObject : AnyObject], fetchCompletionHandler completionHandler: (UIBackgroundFetchResult) -> Void) {
log.debug("Got remote notification: \(userInfo)")
log.debug("Setting up MQTT client...")
let mqtt = MQTTManager.sharedInstance
completionHandler(UIBackgroundFetchResult.NewData)
}
答案 0 :(得分:1)
您可以在该类中定义一个属性来保存完成处理程序(使其成为可选):
var completionHandler: ((UIBackgroundFetchResult) -> Void)?
然后你的didReceiveRemoteNotification
会做类似的事情:
func application(application: UIApplication, didReceiveRemoteNotification userInfo: [NSObject : AnyObject], fetchCompletionHandler completionHandler: (UIBackgroundFetchResult) -> Void) {
log.debug("Got remote notification: \(userInfo)")
log.debug("Setting up MQTT client...")
let mqtt = MQTTManager.sharedInstance
mqtt.completionHandler = completionHandler
}
然后,onMessageCallback
可以执行以下操作:
self.completionHandler?(.NewData) // or .NoData or whatever
self.completionHandler = nil
我必须承认这感觉不对。感觉就像init
函数不仅实例化单例,而且还启动连接,发出请求,你有什么。你没有和我们分享,所以很难说,但感觉不对。 init
应该只是创建单身人士。然后,让我们对其进行配置(例如,指定completionHandler
),然后才会调用单独的connect
函数。