我的双闭合功能不起作用

我的双闭合功能不起作用

问题描述:

我有两个异步功能发送请求到我的服务器。我的双闭合功能不起作用

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

你是否真的检查过“if let this = self'这个条件是否真的是真的?而且,从我的情况来看,所有那些虚弱的自我陈述似乎都是不必要的,你的封闭无法捕捉自我。 –

+0

我试图删除这种情况,并修改了像这样[this](https://pastebin.com/j5Vng1DZ)。它似乎打印0 1 2请成功,但仍然不显示3 – jooneyP

好的,问题不在于此代码中。

当我调用这个函数时,我是这样做的。

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

+0

这不是一个全局变量,只有一个类实例属性。 –

你不需要这行:

weak var weakself = self 

通过在封闭的捕获列表[weak self]self自动变弱。

尝试并用self代替weakself的实例。

我也想你可能甚至不需要if let this = self条件。

我希望这会有所帮助。

+0

[修订后的代码](https://pastebin.com/j5Vng1DZ)这不起作用。它打印0 1 2请成功..仍然不显示3. – jooneyP