swift - 使用 .init(suitename:) 时,对 NSUserDefaults 的观察不起作用
问题描述
如果我使用默认的 UserDefaults,我可以通过 keypath 订阅特定更改的更改。但是,如果我使用使用 init(suiteName:) 创建的 UserDefaults 实例,则不会传递任何更改。
根据 MAC Os 发行说明,该问题已在不久前得到解决。但是,我无法证实这一点。有谁知道这个问题并可能解决它?
在以前的版本中,KVO 只能用于 +standardUserDefaults 方法返回的 NSUserDefaults 实例。此外,KVO 忽略了来自其他进程(例如默认值 (1)、扩展程序或应用程序组中的其他应用程序)的更改。这些限制都已得到纠正。来自其他进程的更改将在主队列上异步传递,并忽略 NSKeyValueObservingOptionPrior。
代码示例:
import UIKit
import Combine
import Foundation
@main
class AppDelegate: UIResponder, UIApplicationDelegate {
let provider = CalendarProvider()
}
extension UserDefaults {
@objc dynamic var startOfTheWeek: Int {
return integer(forKey: "startOfTheWeek")
}
}
final class CalendarProvider: ObservableObject {
@Published var currentCalendar: Calendar = Calendar.current
private var observer: NSKeyValueObservation?
init() {
var calendar = Calendar(identifier: .gregorian)
calendar.firstWeekday = 1
self.currentCalendar = calendar
observer = UserDefaults(suiteName: "group.foo.com")?
.observe(\.startOfTheWeek, options: [.new , .initial],
changeHandler: { (defaults, change) in
DispatchQueue.main.async {
var calendar = Calendar(identifier: .gregorian)
calendar.firstWeekday = change.newValue ?? 1
self.currentCalendar = calendar
}
})
DispatchQueue.main.asyncAfter(deadline: .now() + 5, execute: {
UserDefaults(suiteName: "group.foo.com")?.setValue(8, forKey: "startOfTheWeek")
})
}
deinit {
observer?.invalidate()
}
}
解决方案
推荐阅读
- kubernetes - Kubernetes POD 到外部 URL http://hostname:8080
- javascript - "p[textContent*='Hello']" 是一个有效的 CSS3 选择器吗?
- python - 如何使用 jinja2 从矩阵中打印格式化的多个值?
- c++ - 如何修复布伦森汉姆圆算法的圆间隙
- python - Moto secretsmanager mock 一次不能模拟多个秘密对象
- c# - ShowDialog() extern .cs C# 中的异常
- docker - 使用 Api 或数据库进行自动设置的反向代理
- sulu - 当权限不允许查看该集合的媒体时隐藏 Sulu 媒体集合图块
- laravel-routing - Laravel Route::group[] 无法正常工作
- python-3.x - Pandas Dataframe - 无法访问具有数字名称的列