我的双闭合功能不起作用

时间:2017-09-14 14:09:16

标签: swift swift3 escaping closures completionhandler

我有两个异步功能,可以向我的服务器发送请求。

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
在我签名之后,

似乎没有执行代码。

为什么我的代码无效?

我首先想到的问题是关于队列,但事实并非如此。

2 个答案:

答案 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对象,因为它被声明为全局变量。

相关问题