2017-06-21 26 views
2

我想从Firebase中获取数据并将其作为Swift数组中的对象添加,但是每当我运行应用程序时数组都会输出空白。当我在观察内部放置一个print声明时,每个钱包都会打印出我想要的样子,但钱包永远不会附加到数组中。使用Firebase字典在Swift中填充数组

var purses = [Purse]() 

override func viewDidLoad() { 
    fetchPurse(completion: {print(self.purses.count)}) 
} 

func fetchPurse(completion: @escaping() ->()){ 
    let ref = FIRDatabase.database().reference(fromURL: "https://test-database-ba3a2.firebaseio.com/") 
    let user = (FIRAuth.auth()?.currentUser?.uid)! 
    let userRef = ref.child("users").child(user).child("devices") 

    userRef.observe(.childAdded, with: { (snapshot) in 
     if let dictionary = snapshot.value as? [String: AnyObject]{ 
      let purse = Purse() 
      purse.setValuesForKeys(dictionary) 
      self.purses.append(purse) 
      completion() 
     } 
    }, withCancel: nil) 
} 
+0

你在哪里试图打印数组?您正在将数组填充到异步函数中,因此如果您尝试在完成处理程序之外观察它的值,则很可能在数组填充之前先打印该数组。 –

+0

我正在调用不同函数中的数组,并试图使用.count方法根据有多少钱包为我的表视图加载一定数量的表格单元格。 –

+0

fetchPurse()应该有一个完成处理程序,你应该从完成处理程序调用你的其他函数。 –

回答

1

这听起来像是对异步方法如何工作的误解。

如果使用这样的代码:

//at this point purses is empty.. 
fetchPurse() 
print("purses count = \(purses.count)") 

你总是会看到一个空皮包阵列。

问题是fetchPurse()函数使用Firebase函数observe,它是异步的。它要求Firebase在添加新条目时运行您通过的代码作为您的with:关闭。 observe函数立即返回,并在FireBase添加新的子对象时调用将它传递给它的闭包。

因此,您的fetchPurse()函数也会在新钱包对象添加到您的钱包数组之前返回。

正如@DávidPásztor在他的评论中说,你应该重构fetchPurse采取当皮包阵列被更新时调用完成处理程序:

func fetchPurse(completion:() ->){ 
    let ref = FIRDatabase.database().reference(fromURL: "https://test-database-ba3a2.firebaseio.com/") 
    let user = (FIRAuth.auth()?.currentUser?.uid)! 
    let userRef = ref.child("users").child(user).child("devices") 

    userRef.observe(.childAdded, with: { (snapshot) in 
     if let dictionary = snapshot.value as? [String: AnyObject]{ 
      let purse = Purse() 
      purse.setValuesForKeys(dictionary) 
      self.purses.append(purse) 
      //This is the new line that calls your new completion handler 
      completion() 
     } 
    }, withCancel: nil) 
} 

然后你会这样称呼它:

fetchPurse(completion: { 
    print("purses count = \(purses.count)") 
} 
+0

我更新了问题,我如何实现您的代码,它仍然显示一个空白数组。我包含了我所说的fetchPurse函数以及 –

+0

等等没关系,我明白了。非常感谢! –