数组中的值未从ViewDidLoad传递到ViewWIllAppear

时间:2018-01-25 11:24:59

标签: arrays swift xcode

我在ViewDidLoad运行一个从Firebase获取字符串数组的函数(包含'autoIds'列表),然后我将这个检索到的数组附加到一个变量中,在Vc中初始化。我想在ViewWillAppear中运行的另一个函数中使用此数组的计数,但是尽管成功检索了数据,但变量count不会显示在ViewDidLoadViewWillAppear中,并且将它附加到变量。我花了两天时间研究和调查最好的部分 - 我确信我找不到答案,因为它是如此明显!这是我的代码:

var totalPosts = [String]

我在ViewDidLoad中调用的函数如下: -

func calcTotalPosts() {
    let uid = Auth.auth().currentUser?.uid
    let ref = DB_BASE.child("user-posts").child(uid!)

    ref.observe(.childAdded, with: { (snapshot) in
        let postId = snapshot.key
        self.totalPosts.append(postId)
        print(self.totalPosts)
    }
}

我知道Firebase检索的工作方式与打印时一样,我可以看到所有正确的autoId,但是当我使用相同的print语句在ViewWIllAppear中检查时,数组为空。

任何帮助 - 非常感谢!!

1 个答案:

答案 0 :(得分:1)

您遇到的问题是您对Firebase的请求是异步的,可能需要一些时间才能完成。

那时你的viewWillAppear功能已经运行了。

订单是这样的......

  1. viewDidLoad中
  2. 启动firebase请求
  3. viewWillAppear运行
  4. Firebase请求已完成,您的阵列已填充。
  5. 如果要使用数组中的值来填充视图,则需要响应正在更新的数组。

    我建议在阵列上使用didSet ...

    // this is a property on the class (like it is already) but with a didSet on it
    var totalPosts: [String] = [] {
        didSet {
            // this is a new function that updates the view based on the values in the array
            // e.g. this might populate a label or update a table view
            updateViewWithNewArrayValues()
        }
    }
    

    现在您可以创建此函数,每次数组更改时都会调用它。并且不依赖于Firebase请求需要多长时间。

    您的提取功能将保持不变。但现在在行{... self.totalPosts.append(postId)中它现在将触发didSet在阵列上运行并导致视图更新。

    您不再需要依赖完成功能的时间。对阵列的任何更新都将触发视图更新。