Создание Instagram историй и не может понять структуру данных Firebase - PullRequest
0 голосов
/ 03 июля 2019

У меня есть контроллер представления коллекции, который показывает всех друзей, которые загрузили историю. Модель друзей говорит, что User класс имеет изображение профиля и имя. Это оно. Я показываю всем этим друзьям на подносе истории просто. Теперь, когда я нажимаю на кого-нибудь из этих друзей, я беру истории из базы огня. Структура данных для историй такова:

enter image description here

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
                }
            })
        }

    })

Вопрос заключается в следующем : я хочу синхронизировать пользователя, показанного на панели задач, с массивами историй, которые я получаю. Так что, если первый пользователь, показанный в трее рассказов, скажет «Джим», когда я нажму на Джима, его истории должны быть показаны.

Что я делаю, так это то, что я по отдельности извлекаю информацию каждый раз, когда пользователь нажимает на ячейку истории. Затем он снова извлекает истории из базы данных, и порядок этого массива будет другим. Что может быть хорошим способом получения таких данных. Любая идея со структурой данных может быть полезной. Пожалуйста, помогите!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...