如何从 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
函数。
我正在 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
函数。