我有两个异步功能,可以向我的服务器发送请求。
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
在我签名之后,似乎没有执行代码。
为什么我的代码无效?
我首先想到的问题是关于队列,但事实并非如此。
答案 0 :(得分:1)
您不需要这一行:
weak var weakself = self
通过在闭包的捕获列表中包含[weak self]
,self
会自动变弱。
尝试用weakself
替换self
的实例。
我也在想你甚至可能不需要if let this = self
条件。
我希望这会有所帮助。
答案 1 :(得分:0)
好的,问题不在此代码中。
当我调用此函数时,我这样做了。
func messaging(_ messaging: Messaging, didRefreshRegistrationToken fcmToken: String) {
print("Firebase registration token: \(fcmToken)")
let pushService = PushService()
pushService.updateRegistrationStatus(token: fcmToken)
}
的
pushService.updateRegistrationStatus(token: fcmToken)
是包含我上面提到的代码的函数。
在这种情况下,无法保证函数 updateRegistrationStatus ,因为当消息(...)功能块结束时,ARC会释放pushService本身。
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对象,因为它被声明为全局变量。