2016-11-08 3 views
0

Я работаю над курсом на Udemy, чтобы создать приложение для чата с Firebase, Backendless и Swift. Все проблемы (это было написано для Swift 2, а не 3). Я смог разрешить себя, но у меня все в тупике. Эта функция должна извлекать данные из базы данных Firebase и, по-видимому, она должна была получить ее как NSArray, но теперь она извлекает ее как NSDictionary, которая делает огромный список ошибок в других функциях, потому что она не ожидает Словарь.Извлечение и чтение данных как NSArray из Firebase (Swift 3)

func loadRecents() { 
firebase.childByAppendingPath("Recent").queryOrderedByChild("userId").queryEqualToValue(currentUser.objectId).observeEventType(.Value, withBlock: { 
     snapshot in 
     self.recents.removeAll() 
     if snapshot.exists() { 
      let sorted = (snapshot.value.allValues as NSArray).sortedArrayUsingDescriptors([NSSortDescriptior(key: "date", ascending: false)]) 
     } 
    }) 
} 

Я обновил Свифта 3, насколько:

func loadRecents() { 
    ref = FIRDatabase.database().reference() 
    let userId = currentUser?.getProperty("username") as! String 
    ref.child("Recent").queryOrdered(byChild: "userId").queryEqual(toValue: userId).observe(.value, with: { 
     snapshot in 
     self.recents.removeAll() 
     if snapshot.exists() { 
      let values = snapshot.value as! NSDictionary 
     } 
    }) 
} 

Конечно, используя as! NSArray не работает. Был бы очень признателен, если кто-нибудь может предложить метод для обновления этого, чтобы использовать Swift 3, сортировать его по значению в данных и иметь доступ к нему позже. Благодаря!

ответ

2
func loadRecents() { 
ref = FIRDatabase.database().reference() 
let userId = currentUser?.getProperty("username") as! String 
ref.child("Recent").queryOrdered(byChild: "userId").queryEqual(toValue: userId).observe(.value, with: { 
    snapshot in 
    self.recents.removeAll() 
    if snapshot.exists() { 
     let values = snapshot.value as! [String:AnyObject] 
    } 
})} 

или вы можете использовать также let values = snapshot.value as! [Any]

+0

Спасибо, это помогло, но я вижу, делать больше исследований, что я должен быть используя 'для дочернего элемента в snapshot.children { let myvalue = child.value [" my value "] as! String } 'или что-то подобное, чтобы прочесывать дочерние узлы. Однако, когда я это делаю, он говорит: «NSFastEnumerationIterator не имеет значения элемента», то он предлагает мне передать его AnyObject, но, конечно, это тоже не сработает. Вы знаете, как сделать эту работу? –

+0

@EthanT сначала вы должны проверить тип возврата «child» в режиме отладки – ItsMeMihir

1

Надеются, что это поможет вам, попробуйте этот код:

func loadRecents() { 
    let ref = FIRDatabase.database().reference() 
    let userId = currentUser?.getProperty("username") as! String 
    ref.child("Recent").queryOrdered(byChild: "userId").queryEqual(toValue: userId).observe(.value, with: { 
     snapshot in 
     self.recents.removeAll() 
     guard let mySnapshot = snapshot.children.allObjects as? [FIRDataSnapshot] else { return } 
     for snap in mySnapshot { 
      if let userDictionary = snap.value as? [String: Any] { 
       print("This is userKey \(snap.key)") 
       print("This is userDictionary \(userDictionary)") 
      } 
     } 
    }) 
} 
Смежные вопросы