Firebase에서 스냅샷 하위 항목을 반복합니다.
여러 개체가 포함된 Firebase 리소스가 있는데 Swift를 사용하여 개체를 반복하고 싶습니다.작동할 것으로 예상한 것은 다음과 같습니다(Firebase 설명서에 따름).
https://www.firebase.com/docs/ios-api/Classes/FDataSnapshot.html #//api/name/children
var ref = Firebase(url:MY_FIREBASE_URL)
ref.observeSingleEventOfType(.Value, withBlock: { snapshot in
println(snapshot.childrenCount) // I got the expected number of items
for rest in snapshot.children { //ERROR: "NSEnumerator" does not have a member named "Generator"
println(rest.value)
}
})
그래서 Firebase에서 반환한 NSE Numerator 객체에 대해 Swift가 반복하는 것에 문제가 있는 것 같습니다.
도움은 정말 환영합니다.
설명서를 제대로 읽는다면 다음과 같이 하십시오.
var ref = Firebase(url: MY_FIREBASE_URL)
ref.observeSingleEvent(of: .value) { snapshot in
print(snapshot.childrenCount) // I got the expected number of items
for rest in snapshot.children.allObjects as! [FIRDataSnapshot] {
print(rest.value)
}
}
더 나은 방법은 다음과 같습니다.
var ref = Firebase(url: MY_FIREBASE_URL)
ref.observeSingleEvent(of: .value) { snapshot in
print(snapshot.childrenCount) // I got the expected number of items
let enumerator = snapshot.children
while let rest = enumerator.nextObject() as? FIRDataSnapshot {
print(rest.value)
}
}
첫 번째 방법은 다음과 같습니다.NSEnumerator
일반적인 방법으로 열거할 수 있는 모든 개체의 배열을 반환합니다.두 번째 방법은 객체를 한 번에 하나씩 가져옵니다.NSEnumerator
더 효율적일 수 있습니다.
두 경우 모두 열거되는 개체는 다음과 같습니다.FIRDataSnapshot
객체, 그래서 당신은 당신이 접근할 수 있도록 깁스가 필요합니다.value
소유물.
사용.for-in
루프:
스위프트 1.2일 만에 원래 답변을 다시 쓴 이후로 언어는 발전했습니다.이제 다음을 사용할 수 있습니다.for in
열거자와 함께 직접 작동하는 루프case let
유형 할당:
var ref = Firebase(url: MY_FIREBASE_URL)
ref.observeSingleEvent(of: .value) { snapshot in
print(snapshot.childrenCount) // I got the expected number of items
for case let rest as FIRDataSnapshot in snapshot.children {
print(rest.value)
}
}
방금 위 답변을 Swift 3으로 변환했습니다.
ref = FIRDatabase.database().reference()
ref.observeSingleEvent(of: .value, with: { snapshot in
print(snapshot.childrenCount) // I got the expected number of items
for rest in snapshot.children.allObjects as! [FIRDataSnapshot] {
print(rest.value)
}
})
더 나은 방법은 다음과 같습니다.
ref = FIRDatabase.database().reference()
ref.observeSingleEvent(of: .value, with: { snapshot in
print(snapshot.childrenCount) // I got the expected number of items
let enumerator = snapshot.children
while let rest = enumerator.nextObject() as? FIRDataSnapshot {
print(rest.value)
}
})
이것은 꽤 읽기 쉽고 잘 작동합니다.
var ref = Firebase(url:MY_FIREBASE_URL)
ref.childByAppendingPath("some-child").observeSingleEventOfType(
FEventType.Value, withBlock: { (snapshot) -> Void in
for child in snapshot.children {
let childSnapshot = snapshot.childSnapshotForPath(child.key)
let someValue = childSnapshot.value["key"] as! String
}
})
ref = FIRDatabase.database().reference().child("exampleUsernames")
ref.observeSingleEvent(of: .value, with: { snapshot in
for rest in snapshot.children.allObjects as! [FIRDataSnapshot] {
guard let restDict = rest.value as? [String: Any] else { continue }
let username = restDict["username"] as? String
}
})
파이어베이스 4.0.1
Database.database().reference().child("key").observe(.value) { snapshot in
if let datas = snapshot.children.allObjects as? [DataSnapshot] {
let results = datas.flatMap({
($0.value as! [String: Any])["xxx"]
})
print(results)
}
}
파이어베이스 7.3.0
Database.database().reference().child("key").observe(.value) { snapshot in
if let datas = snapshot.children.allObjects as? [DataSnapshot] {
let results = datas.compactMap({
($0.value)
})
print(results)
}
}
키/값이 여러 개 있고 다음과 같은 경우return
하나의array
와 함께dictionary
요소, 배열 선언:
var yourArray = [[String: Any]]()
그런 다음 블록 본문을 다음으로 변경합니다.
let children = snapshot.children
while let rest = children.nextObject() as? DataSnapshot, let value = rest.value {
self.yourArray.append(value as! [String: Any])
}
언급URL : https://stackoverflow.com/questions/27341888/iterate-over-snapshot-children-in-firebase
'source' 카테고리의 다른 글
명명된 범위 범위 변경 방법 (0) | 2023.06.06 |
---|---|
ggplot에서 선 너비를 변경하는 방법은 무엇입니까? (0) | 2023.06.06 |
프로젝트를 다른 프로젝트의 참조로 추가하는 방법 (0) | 2023.06.06 |
Android Studio에서 "Android SDK 선택" 방법은 무엇입니까? (0) | 2023.06.06 |
R의 작업 공간에서 하나를 제외한 모든 개체를 제거하려면 어떻게 해야 합니까? (0) | 2023.06.06 |