如何解决Swift-计时器无法访问更新的实例属性
在我的本机项目的本机模块中,我需要定期从Objective-C向Swift发送一些数据,因此我正在使用NSNotificationCenter。我在Swift类中的观察器附带的函数中成功接收到数据,并将其存储在属性中。
如果我通过任何实例方法调用访问此属性,则可以看到该值已更新。
但是,如果我访问计时器附带的选择器函数中的相同属性,则好像该值尚未更新,并且我不知道为什么吗?似乎计时器选择器函数除了该属性的初始值之外无权访问其他任何内容-我也尝试将该属性作为userInfo的一部分传递给Timer,但问题是相同的。
[[NSNotificationCenter defaultCenter] postNotificationName:@"stateDidUpdate" object:nil userInfo:state];
class StateController {
var state: Dictionary<String,Any> = Dictionary()
var timer: Timer = Timer()
func subscribeToNotifications() {
NotificationCenter.default.addObserver(
self,selector: #selector(receivedStateUpdate),name: NSNotification.Name.init(rawValue: "stateDidUpdate"),object: nil)
}
@objc func receivedStateUpdate(notification: NSNotification) {
if let state = notification.userInfo {
self.state = (state as? Dictionary<String,Any>)!
print("\(self.state)") // I can see that self.state has been updated here
}
}
func runTimer() {
self.timer = Timer(timeInterval: 0.1,target: self,selector: #selector(accessState(timer:)),userInfo: nil,repeats: true)
self.timer.fire()
RunLoop.current.add(self.timer,forMode: RunLoop.Mode.default)
RunLoop.current.run(until: Date(timeIntervalSinceNow: 2))
}
@objc func accessState(timer: Timer) {
print("\(self.state)") // state is an empty Dictionary when accessed here
}
func printState() {
"\(self.state)" // value printed is the updated value received from the notification
}
}
解决方法
我发现正在创建我的Swift类的多个实例导致了此问题。我以为React Native会在调用本机模块时创建一个单例,但似乎可以创建多个实例,因为我可以看到调用了init方法的次数。遵循出色的video和出色的gist的知识,切换到Singleton模式为我解决了有关如何在React Native项目中创建Singleton的问题
class StateController {
static let shared = StateController()
private override init() {
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。