如何从 Singleton class 调用 completionHandler?

How to call completionHandler from Singleton class?

我正在 Swift 中编写一个应用程序,其中我实现了 singleton class handling the data retrieval via Moscapsule

当我通知我的应用程序有 content-available: 1 的新数据时,会调用正确的函数,而我目前只在

let mqtt = MQTTManager.Instance
completionHandler(UIBackgroundFetchResult.NewData)

管理器在 init 上创建连接,然后 onMessageCallback 使用新数据。

如果应用程序最近 运行 处于后台并且单例 class 保持网络连接,则此方法有效。但这不是正确的方法。

我是 iOS 和 Swift 开发的新手,我怎样才能等待最长时间?当数据进来时,我可以发送 UIBackgroundFetchResult.NewData,如果没有数据,我可以发送 UIBackgroundFetchResult.Failed.

我的第一个想法是编写一个循环,检查 class 中的变量是否每 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)
}

您可以在 class 中定义一个 属性 来保存完成处理程序(使其成为可选的):

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