获取应用程序的通知设置时是否需要 Weak self
Is Weak self required while fetching notification settings of the app
我正在查询通知设置值,但我想知道是否需要 [weak self]
。
有人请澄清:
UNUserNotificationCenter.current().getNotificationSettings { [weak self] appsettings in
var mybool = false
if appsettings.authorizationStatus == .authorized {
mybool = true
}
DispatchQueue.main.async { [self] in
self?.vu.isEnabled = mybool
}
}
如果 [weak self]
捕获列表的目的是防止强引用循环,那么,不,没有必要。这个 getNotificationSettings
闭包是异步调用的,它的闭包(以及它捕获的任何东西)都会被快速释放,所以由闭包引入的任何强引用都会很快得到解决。
但是,如果您使用 [weak self]
来避免在异步任务 运行 时不必要地保留强引用(例如,在不太可能的情况下 self
在此之前被取消闭包运行),那么,是的,weak
参考是谨慎的。如果关闭的唯一目的是更新可能不再可见的控件,则保留强引用毫无意义。
有人会说 [weak self]
也是谨慎的,因为看一眼代码就可以立即确定没有引入强引用循环。您不必浪费任何时间推理通知中心API;您会立即发现不存在强引用循环风险。任何时候你都可以一目了然地推理你的代码,这是一件好事。
简而言之,[weak self]
捕获列表不是必需的,但要谨慎。
两个不相关的观察结果:
我会在对主队列的调度中删除 [self]
捕获列表。 [self]
捕获列表的 whole idea 允许闭包内的隐式 self
引用,因为已经声明了使用 self
的意图。
但这是在 getNotificationSettings
的 [weak self]
闭包内,而且您正在使用 self?.
可选链接语法。 [self]
捕获列表不仅没有实际意义,而且只会向您的代码的未来读者发送相互矛盾的消息。我会删除 [self]
捕获以分派到主队列。
如果您提出关于删除 [weak self]
捕获列表的问题是为了简化代码,我会保留 weak
捕获,但简化其余部分:
UNUserNotificationCenter.current().getNotificationSettings { [weak self] settings in
DispatchQueue.main.async {
self?.vu.isEnabled = settings.authorizationStatus == .authorized
}
}
我正在查询通知设置值,但我想知道是否需要 [weak self]
。
有人请澄清:
UNUserNotificationCenter.current().getNotificationSettings { [weak self] appsettings in
var mybool = false
if appsettings.authorizationStatus == .authorized {
mybool = true
}
DispatchQueue.main.async { [self] in
self?.vu.isEnabled = mybool
}
}
如果 [weak self]
捕获列表的目的是防止强引用循环,那么,不,没有必要。这个 getNotificationSettings
闭包是异步调用的,它的闭包(以及它捕获的任何东西)都会被快速释放,所以由闭包引入的任何强引用都会很快得到解决。
但是,如果您使用 [weak self]
来避免在异步任务 运行 时不必要地保留强引用(例如,在不太可能的情况下 self
在此之前被取消闭包运行),那么,是的,weak
参考是谨慎的。如果关闭的唯一目的是更新可能不再可见的控件,则保留强引用毫无意义。
有人会说 [weak self]
也是谨慎的,因为看一眼代码就可以立即确定没有引入强引用循环。您不必浪费任何时间推理通知中心API;您会立即发现不存在强引用循环风险。任何时候你都可以一目了然地推理你的代码,这是一件好事。
简而言之,[weak self]
捕获列表不是必需的,但要谨慎。
两个不相关的观察结果:
我会在对主队列的调度中删除
[self]
捕获列表。[self]
捕获列表的 whole idea 允许闭包内的隐式self
引用,因为已经声明了使用self
的意图。但这是在
getNotificationSettings
的[weak self]
闭包内,而且您正在使用self?.
可选链接语法。[self]
捕获列表不仅没有实际意义,而且只会向您的代码的未来读者发送相互矛盾的消息。我会删除[self]
捕获以分派到主队列。如果您提出关于删除
[weak self]
捕获列表的问题是为了简化代码,我会保留weak
捕获,但简化其余部分:UNUserNotificationCenter.current().getNotificationSettings { [weak self] settings in DispatchQueue.main.async { self?.vu.isEnabled = settings.authorizationStatus == .authorized } }