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

Posted

技术标签:

【中文标题】我的双重关闭功能不起作用【英文标题】:My double-closure function is not working 【发布时间】:2017-09-14 14:09:15 【问题描述】:

我有两个向我的服务器发送请求的异步函数。

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

我的 PLEASE 签名后似乎没有执行代码。

为什么我的代码不起作用?

我一开始以为问题出在队列上,其实不是。

【问题讨论】:

您是否真的检查了条件if let this = self 是否真的为真?此外,所有那些弱自我陈述似乎都是不必要的,据我从上下文中可以看出,你的闭包都没有捕获自我。 我已尝试删除该条件并像这样修改this。它似乎打印了 0 1 2 PLEASE success 但在 3 之后仍然没有显示 【参考方案1】:

你不需要这一行:

weak var weakself = self

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

尝试用 self 替换 weakself 的实例。

我还认为您甚至可能不需要if let this = self 条件。

我希望这会有所帮助。

【讨论】:

Revised Code 这也不起作用。它打印 0 1 2 PLEASE success.. 3 后仍未显示。【参考方案2】:

好的,问题不在这段代码中。

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

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 本身是在 messaging(...) 函数块结束时被 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 对象没有被释放,因为它被声明为全局变量。

【讨论】:

那不是全局变量,只是类实例属性。

以上是关于我的双重关闭功能不起作用的主要内容,如果未能解决你的问题,请参考以下文章

为啥我的函数在调用时不起作用? [关闭]

jquery弹出关闭功能不起作用

JQuery 移动工具提示弹出(“关闭”)功能在 iPhone 5 中不起作用

为啥我的 Pandas 引用多个列的“应用”函数不起作用? [关闭]

地理位置有时不起作用[关闭]

为啥列表容器的排序功能不起作用[关闭]