我从Firebase获取一些用户信息并将其存储到单例中。之后,每次价值发生变化时,我都希望标签也发生变化,但在我终止应用程序并重新登录之前,它不会发生变化。
如果单值中的值发生变化,我应该如何更新标签?
我有标签视图。在第一个选项卡中,我分配值,在第二个选项卡中,我尝试将值设置为标签。
这是我的单身人士:
class CurrentUser: NSObject
{
var generalDetails: User = User()/// Consecutive declarations on a line must be separated by ';'
static let sharedInstance = CurrentUser()
fileprivate override init(){
super.init()
}
}
像这样我分配值:
self.databaseRef.child("users").child(user.uid).observeSingleEvent(of: .value) { (snapshot:FIRDataSnapshot) in
guard let firebaseValue = snapshot.value as? [String:AnyObject], let userName = firebaseValue["username"] as? String, let email = firebaseValue["email"] as? String, let reputation = firebaseValue["reputation"] as? Int, let profilePicURL = firebaseValue["profileImageUrl"] as? String
else
{
print("Error with FrB snapshot")//Here
return
}
//Set values
self.currentUser.generalDetails = User(userName: userName, email: email, reputation: reputation, profileImageURL: profilePicURL, uid: user.uid)
}
如果我想把价值放在标签上,我就这么做(这个声誉是唯一可以经常改变的东西):
self.reputationLabel.text = String(self.currentUser.generalDetails.reputation)
答案 0 :(得分:1)
您可以执行以下任一操作: -
使用delegate-protocol方法在单例和您的类之间进行通信,只要您的repo更改并更新标签,就会在类中触发委托方法。
在您的网络链接中打开一个不同的主题,以获取用户在viewController中的声誉: -
override func viewDidLoad() {
super.viewDidLoad()
FIRDatabase.database().reference().child("users").child(FIRAuth.auth()!.currentUser!.uid).child("reputation").observe(.childChanged, with: {(Snapshot) in
print(Snapshot.value!)
//Update yor label
})
每次声誉值发生变化时都会调用。
答案 1 :(得分:0)
我喜欢Dravidian的答案,我想提供另一种选择:KVO
我们使用键值观察来监控我们的应用是否与Firebase服务器断开连接。这是概述。
我们有一个存储布尔变量isConnected的单例,并且通过观察Firebase中的特殊节点来设置该变量
var isConnected = rootRef.child(".info/connected")
连接/断开连接时,isConnected var会改变状态。
我们的视图上有一个小图标,表示用户已连接状态;连接时它是绿色的,当它断开连接时它是红色的,并且有一条线穿过它。
该图标是一个类,在每个类中我们都有代码来观察isConnected变量;当状态发生变化时,所有图标都会自动更改。
只需很少的代码,可重复使用,干净且易于维护。
这是Apple文档中的代码段
//define a class that you want to observe
class MyObjectToObserve: NSObject {
dynamic var myDate = NSDate()
func updateDate() {
myDate = NSDate()
}
}
//Create a global context variable.
private var myContext = 0
//create a class that observes the myDate var
// and will be notified when that var changes
class MyObserver: NSObject {
var objectToObserve = MyObjectToObserve()
objectToObserve.addObserver(self,
forKeyPath: "myDate",
options: .new,
context: &myContext)
它会有更多的东西,但它的距离是10k英尺。
Apple文档在这里
Using Swift with Cocoa and Obj-c 3.01: Design Patterns
并向下滚动键值观察部分。这是一个很好的阅读,非常强大。它遵循与Firebase相同的设计模式(反之亦然) - 观察节点(变量)并告诉我它何时发生变化。