我的双重关闭功能不起作用
My double-closure function is not working
我有两个向我的服务器发送请求的异步函数。
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
似乎没有在我的“请”签名后执行代码。
为什么我的代码不起作用?
我一开始以为是队列的问题,其实不是。
你不需要这一行:
weak var weakself = self
通过在闭包的捕获列表中包含 [weak self]
,self
自动变弱。
尝试将 weakself
的实例替换为 self
。
我还认为您可能甚至不需要 if let this = self
条件。
希望对您有所帮助。
好的,问题不在这段代码中。
我调用这个函数的时候是这样的。
func messaging(_ messaging: Messaging, didRefreshRegistrationToken fcmToken: String) {
print("Firebase registration token: \(fcmToken)")
let pushService = PushService()
pushService.updateRegistrationStatus(token: fcmToken)
}
pushService.updateRegistrationStatus(token: fcmToken)
是包含我上面询问的代码的函数。
在这种情况下,函数updateRegistrationStatus是无法保证的,因为当messaging(...)函数时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对象没有被释放,因为它被声明为一个全局变量。
我有两个向我的服务器发送请求的异步函数。
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
似乎没有在我的“请”签名后执行代码。
为什么我的代码不起作用?
我一开始以为是队列的问题,其实不是。
你不需要这一行:
weak var weakself = self
通过在闭包的捕获列表中包含 [weak self]
,self
自动变弱。
尝试将 weakself
的实例替换为 self
。
我还认为您可能甚至不需要 if let this = self
条件。
希望对您有所帮助。
好的,问题不在这段代码中。
我调用这个函数的时候是这样的。
func messaging(_ messaging: Messaging, didRefreshRegistrationToken fcmToken: String) {
print("Firebase registration token: \(fcmToken)")
let pushService = PushService()
pushService.updateRegistrationStatus(token: fcmToken)
}
pushService.updateRegistrationStatus(token: fcmToken)
是包含我上面询问的代码的函数。
在这种情况下,函数updateRegistrationStatus是无法保证的,因为当messaging(...)函数时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对象没有被释放,因为它被声明为一个全局变量。