Мне кажется, я понимаю вопрос, и есть несколько способов его решить.
1) Группа внутри поста
PlanIt
plans
-LETR-XJvQsZCOpG-T1N
Uid: "ZjtJdkjzuxc0mZn4u9TfWsXa9jh2"
date: "20180609"
images:
image_0: "https://img.evbuc.com/https%3A%2F%2Fcdn.evbuc.c.."
image_1: "https://img.evbuc.com/https%3A%2F%2Fcdn.evbuc.c.."
plans
plan_0: "Bike Rodeo, Safety Presentation and Riding Tour o"
plan_1: "Bike Rodeo, Safety Presentation and Riding Tour o"
title: "This weekend Plans?"
-Yjijiioimoifijjiuee
Uid: "asdaasdas"
etc
Ключиimage_0, image_0, plan_0, plan_1 и т. д. будут созданы с помощью childByAutoId.
При этом вы можете загрузить публикацию один раз и получить с ней все необходимые дочерние данные.
Обратите внимание, что покаэта структура выглядит «глубокой», что обычно не рекомендуется в Firebase NoSQL, вы не будете выполнять какие-либо запросы к глубоким данным, и эти данные относятся к посту, поэтому в этом случае все в порядке.
2) Денормализация / выравнивание структуры
PlanIt
plans
-LETR-XJvQsZCOpG-T1N
Uid: "ZjtJdkjzuxc0mZn4u9TfWsXa9jh2"
date: "20180609"
title: "This weekend Plans?"
-UYijs09as9jiosdijfi
Uid: "some uid"
date: "20180609"
title: "some title"
all_images:
-LETR-XJvQsZCOpG-T1N
image_0: "https://img.evbuc.com/https%3A%2F%2Fcdn.evbuc.c.."
image_1: "https://img.evbuc.com/https%3A%2F%2Fcdn.evbuc.c.."
all_plan_details
-LETR-XJvQsZCOpG-T1N
detail_0: "Bike Rodeo, Safety Presentation and Riding Tour o"
detail_1: "Bike Rodeo, Safety Presentation and Riding Tour o"
второй вариант потребует начальной загрузки почтового узла для получения его ключа и затем одного вызова узла all_images для загрузки изображений и вызовачтобы все планы, чтобы получить его планы.Обратите внимание, что я использую ключ posts для ссылки на дочерний узел all_images и all_plans.
Идея заключается в том, что мы используем ключ дочернего элемента PlanIt в качестве ссылки на этот узел в узле all_images и all_plans.image_0, image_1, plan_0, plan_1 - это ключи, сгенерированные с помощью .childByAutoId
Второй вариант довольно крутой, потому что, например, у вас есть табличное представление со списком только заголовков и дат, а затем, когда пользователь нажимает на него,Вы можете загружать изображения или планы в другое представление ... Этот параметр будет загружать намного меньше данных за раз, что делает его немного более управляемым с точки зрения памяти.
РЕДАКТИРОВАТЬ
Чтобы прояснить процесс, вот код, который нужно прочитать в плане, изображениях и деталях плана и распечатать их на консоли на основе структуры выше.
let mainRef = self.ref.child("PlanIt")
let plansRef = mainRef.child("plans")
let allImagesRef = mainRef.child("all_images")
let allPlanDetailsRef = mainRef.child("all_plan_details")
plansRef.observeSingleEvent(of: .value, with: { snapshot in
for child in snapshot.children {
let childSnap = child as! DataSnapshot
let dict = childSnap.value as! [String: Any]
let planKey = childSnap.key
let title = dict["title"] as! String
let thisPlansImagesRef = allImagesRef.child(planKey)
let thisPlansDetailsRef = allPlanDetailsRef.child(planKey)
thisPlansImagesRef.observeSingleEvent(of: .value, with: { imageSnapshot in
thisPlansDetailsRef.observeSingleEvent(of: .value, with: { planDetailSnapshot in
//printing is done here because firebase is asynchronous and all data
// will be valid for each node ONLY at this point
print("plan: \(planKey) \(title)")
for imageChild in imageSnapshot.children {
let imageChildSnap = imageChild as! DataSnapshot
let image = imageChildSnap.value as! String
print(" image: \(image)")
}
for planDetailChild in planDetailSnapshot.children {
let planDetailChildSnap = planDetailChild as! DataSnapshot
let planDetail = planDetailChildSnap.value as! String
print(" planDetail: \(planDetail)")
}
})
})
}
})
, и результат будет:
plan: plan_0 This weekend plans
image: some image for plan_0
image: another_image for plan_0
planDetail: some plan detail for plan_0
planDetail: another plan detail for plan_0
plan: plan_1 Next weekend plans
Я добавил несколько текстовых значений в свою Firebase, чтобы было более понятно, что происходит в выводе.