gpt4 book ai didi

ios - 如何从 Singleton 类调用 completionHandler?

转载 作者:行者123 更新时间:2023-11-29 02:17:38 26 4
gpt4 key购买 nike

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

最佳答案

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

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

关于ios - 如何从 Singleton 类调用 completionHandler?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28569031/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com