如何从Singleton类调用completionHandler?

时间:2015-02-17 18:58:02

标签: ios swift apple-push-notifications

我正在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)
}

1 个答案:

答案 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函数。