我的双重关闭功能不起作用

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对象没有被释放,因为它被声明为一个全局变量。