在Firebase注销上刷新视图控制器

时间:2018-02-19 21:12:52

标签: swift firebase

我有一个视图控制器,它有一个UICollectionView,从Firebase中提取信息。当用户访问此视图控制器时,他们的信息将放置在集合视图单元格中。

但是,当用户注销并使用其他帐户登录时,先前用户的数据将保留在集合视图中,而不是使用新用户的信息重新填充。

现在,所有内容都来自viewDidLoad()

override func viewDidLoad() {
    super.viewDidLoad()
    loadData()
    loadOngoingQuest()

    collectionView.dataSource = self
    collectionView.delegate = self
}

loadData()loadOngoingQuest()将Firebase中的信息提取到用于填充集合视图的数组中。

我尝试在viewWillAppear()中添加所有内容,但它会导致一些故障,因为集合视图涉及滚动和其他动画,我不想在每次出现视图控制器时运行它们。

基本上我只是想在每次用户注销时重新加载整个视图控制器。我怎么能这样做?

2 个答案:

答案 0 :(得分:1)

您应该这样做,请参阅评论以获取更多信息:

let firebaseAuth = FIRAuth.auth()
do {
    try firebaseAuth?.signOut()
    // clear the array that your collectionView is based on
    // reload your collectionView (which will clear all the data since your array is empty)
} catch let signOutError as NSError {
    print ("Error signing out: %@", signOutError)
}

<强>更新
另一种处理方式:

使用以下属性创建Struct

struct Global {
    var isNewUser = false
}

每当您注销用户时,请执行以下操作:

Global.isNewUser = true

collectionView中,您检查Global.isNewUser == true是否重新加载所有内容,最重要的是设置Global.isNewUser = false。这样你只会加载一次。

答案 1 :(得分:0)

经过很多挫折之后,我发现了这个问题!

这与刷新集合视图或视图控制器无关。我使用Firebase引用错误。我在一个结构中保存了两个ref作为全局常量,希望不必在每个VC上声明它们。就像这样:

var questsRef = var questsRef = GlobalConstants.Refs.userRef.reference().child("quests")

然后我会在我的代码中的任何地方使用它们:

let userRef = AppDatabaseReference.users(uid: (Auth.auth().currentUser?.uid)!).reference()

这会导致问题,除非我终止应用并再次打开它,刷新这些变量。

我回到每个VC的顶部声明{{1}},它解决了这个问题!