我的双重关闭功能不起作用
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 移动工具提示弹出(“关闭”)功能在 iPhone 5 中不起作用