У меня есть контроллер представления коллекции, который показывает всех друзей, которые загрузили историю. Модель друзей говорит, что User
класс имеет изображение профиля и имя. Это оно. Я показываю всем этим друзьям на подносе истории просто. Теперь, когда я нажимаю на кого-нибудь из этих друзей, я беру истории из базы огня. Структура данных для историй такова:
storyID
- это document.id. storyAuthorID
относится к user.id, который создал эту историю. storyMediaURL
- это фотография, добавленная пользователем.
По сути, я извлекаю истории из firebase при условии, что author.id - мой друг. Это, кажется, происходит правильно. Затем я добавляю все истории из одного author.id в один массив. А потом я иду к следующему другу и ищу идентификатор автора с friend.id. Если он существует, я извлекаю все истории для этого и добавляю его в другой массив. В конце концов я получаю массив массивов.
let db = Firestore.firestore()
let storiesReference = db.collection("network_stories")
let socialManager = FirebaseSocialGraphManager()
var friendsStories : [[Story]] = []
var friendsStoryRetrieved: [User] = []
socialManager.fetchFriends(viewer: loggedInUser) { (fetchedFriends) in
let friends = fetchedFriends
for friend in friends {
var singleUserStory : [Story] = []
guard let friendUID = friend.uid else { return }
let storyRef = storiesReference.whereField("storyAuthorID", isEqualTo: friendUID).order(by: "createdAt", descending: false)
storyRef.getDocuments(completion: { (querySnapshot, error) in
if let _ = error {
print("Couldn't fetch Friend Story")
return
}
guard let snapshot = querySnapshot else {
print("No Document for the friend")
return
}
let documents = snapshot.documents
for doc in documents {
let data = doc.data()
let newStory = Story(jsonDict: data)
singleUserStory.append(newStory)
}
friendsStories.append(singleUserStory)
friendsStoryRetrieved.append(friend)
if friendsStoryRetrieved.count == fetchedFriends.count {
print("The total stories are: \(friendsStories.count)")
completion(friendsStories)
}
})
}
}
То есть friendsStories
- это [[Story]]
. Я передаю это в свой storyPreviewController, количество массивов в основном массиве - это то, сколько pageViewControllers
должно создать количество контроллеров представления. Затем каждому контроллеру представления дается массив изнутри.
Теперь давайте вернемся. Я также хочу заполнить лоток для историй пользователями, которые опубликовали статью. Так что мне просто нужен пользовательский класс. Я могу получить доступ к пользователю из каждой истории, используя storyAuthor.id.
Я использую метод fetchStories, но на этот раз я создаю пользователя из каждого storyAuthorID и помещаю его в массив.
self.socialManager?.fetchStories(loggedInUser: user, completion: { (stories) in
let userManager = SocialFirebaseUserManager()
for story in stories {
let first = story.first
guard let firstItem = first else {
print("No Item n")
return
}
let authorID = firstItem.storyAuthorID
userManager.fetchUser(userID: authorID, completion: { (user) in
guard let storyUser = user else {
print("No Item")
return
}
fetchedFriends.append(storyUser)
if stories.count == fetchedFriends.count {
print("Stories count: \(stories.count)")
print("Friends count: \(fetchedFriends.count)")
self.friends = fetchedFriends // These are friends with stories posted
}
})
}
})
Вопрос заключается в следующем : я хочу синхронизировать пользователя, показанного на панели задач, с массивами историй, которые я получаю. Так что, если первый пользователь, показанный в трее рассказов, скажет «Джим», когда я нажму на Джима, его истории должны быть показаны.
Что я делаю, так это то, что я по отдельности извлекаю информацию каждый раз, когда пользователь нажимает на ячейку истории. Затем он снова извлекает истории из базы данных, и порядок этого массива будет другим. Что может быть хорошим способом получения таких данных. Любая идея со структурой данных может быть полезной. Пожалуйста, помогите!