我的双闭合功能不起作用
我有两个异步功能发送请求到我的服务器。我的双闭合功能不起作用
DispatchQueue.global(qos: .userInitiated).async {
weak var weakself = self
self.unregisterPushServer(token: token!) { [weak self] success in
print("0")
if success {
print("1")
weakself?.unregisterPushInfoKeychain(token: token!)
print("2")
if let this = self {
print("PLEASE")
weakself?.registerPushServer(token: token!) { [weak this] success in
print("3")
if success {
print("4")
this?.registerPushInfoKeychain()
print("5")
}
}
}
print("success")
}
}
}
而且功能也
private func registerPushServer(token: String, completion: @escaping (Bool) ->()) {
request() { (data, error) in
if data != nil {
completion(true)
} else {
completion(false)
}
}
private func unregisterPushServer(token: String, completion: @escaping (Bool) ->()) {
request2() { (data, error) in
if data != nil {
completion(true)
} else {
completion(false)
}
}
但在控制台,
0
1
2
success
似乎没有经过我请登录到执行代码。
为什么我的代码不工作?
我首先想到的问题是关于队列,但事实并非如此。
好的,问题不在于此代码中。
当我调用这个函数时,我是这样做的。
func messaging(_ messaging: Messaging, didRefreshRegistrationToken fcmToken: String) {
print("Firebase registration token: \(fcmToken)")
let pushService = PushService()
pushService.updateRegistrationStatus(token: fcmToken)
}
的
pushService.updateRegistrationStatus(token: fcmToken)
是其中包含我上面提出的代码的功能。
在这种情况下,该功能updateRegistrationStatus没有保证,因为pushService本身是由ARC释放时消息(...)功能块结束。
class AppDelegate: UIResponder, UIApplicationDelegate {
let pushService = PushService()
...
func messaging(_ messaging: Messaging, didRefreshRegistrationToken fcmToken: String) {
print("Firebase registration token: \(fcmToken)")
self.pushService.updateRegistrationStatus(token: fcmToken)
}
}
现在pushService对象没有被释放,因为它被声明为全局变量。
这不是一个全局变量,只有一个类实例属性。 –
你不需要这行:
weak var weakself = self
通过在封闭的捕获列表[weak self]
,self
自动变弱。
尝试并用self
代替weakself
的实例。
我也想你可能甚至不需要if let this = self
条件。
我希望这会有所帮助。
[修订后的代码](https://pastebin.com/j5Vng1DZ)这不起作用。它打印0 1 2请成功..仍然不显示3. – jooneyP
你是否真的检查过“if let this = self'这个条件是否真的是真的?而且,从我的情况来看,所有那些虚弱的自我陈述似乎都是不必要的,你的封闭无法捕捉自我。 –
我试图删除这种情况,并修改了像这样[this](https://pastebin.com/j5Vng1DZ)。它似乎打印0 1 2请成功,但仍然不显示3 – jooneyP