Swift Firebase -Как отслеживать изменения узлов на нескольких пользователей и их сообщений - PullRequest
0 голосов
/ 20 июня 2019

В моем приложении пользователи могут продавать предметы.Покупатель запрашивает их площадь (например, радиус 1 миля) и получает всех продавцов в этой области, и появляются все сообщения / предметы, которые продавцы имеют для продажи.

Как только покупатель видит товар, он может щелкнутьВ ячейке отобразится новый виртуальный канал, и они увидят цену и описание. Оттуда они могут добавить товар в корзину, в которой будет показан другой виртуальный канал, и оттуда перейти на другой виртуальный канал, чтобы произвести оплату за элемент..

HomeVC > Price/DescriptionVC > ShoppingCartVC > PaymentVC

HomeVC - это место, где все данные изначально извлекаются из базы данных.Когда данные возвращаются, может быть несколько продавцов, у каждого из которых есть несколько постов / предметов для продажи (которые все показаны).

Если покупатель находится в VC «Цена / Описание» (или любой из следующих vcs) иодин из продавцов меняет свое имя пользователя или цену просматриваемого товара, как мне отслеживать эту информацию в db , чтобы обновить виртуальный канал, чтобы отразить изменение в информации?

Например, покупатель находится на VC «Цена / Описание» и просматривает пару коньков по 10 долларов от продавца по имени Питер.Питер меняет свое имя на Пола и увеличивает цену на коньки до 20 долларов.Я думаю, что эти изменения теперь должны быть обновлены в Price / DescriptionVC, чтобы покупатель заплатил новую цену в 20 долларов за человека по имени Пол, а не 10 долларов за человека по имени Питер.

Код ниже:

  1. получить все идентификаторы продавца в радиусе 1 мили от покупателя и добавить их в arrOfSellerIds
  2. перейти к sellersRef и получить идентификатор продавца, имя пользователя, profileUrl, а также адрес электронной почты идобавьте их в arrOfSellers
  3. , перейдите к postsRef и извлеките все сообщения от продавца и добавьте их все в tableData collectionView, затем перезагрузите код

:

var arrOfSellerIds = [String]()
var arrOfSellers = [Seller]()
var tableData = [Post]()

// #1 get all the sellers within a 1 mile radius
regionQuery = geoFire.query(with: oneMileRegion) // set earlier
queryHandle = regionQuery?.observe(.keyEntered, with: {(key: String!, location: CLLocation!) in

    self.arrOfSellerIds.append(key)
})
regionQuery?.observeReady({

    self.fetchTheSellersFromSellersRef()
})

// #2 get the seller's uid, name, profile pic, and email
func fetchTheSellersFromSellersRef() {

    let dispatchGroup = DispatchGroup()

    for sellerId in arrOfSellerIds {

        dispatchGroup.enter()

        let sellersRef = Database.database().reference().child("sellers").child(sellerId)
        sellersRef.observeSingleEvent(of: .value, with: {(snapshot) in

            guard let dict = snapshot.value as? [String: Any] else { dispatchGroup.leave(); return }

            let seller = Seller(dict: dict) // userId, username, profileURL, email

            self.arrOfSellers.append(seller)
            dispatchGroup.leave()

        })
        dispatchGroup.notify(queue: .global(qos: .background)) {

            self.getAllPostsFromSellerAndReloadCollectionView()
        }
    }
}

// #3 get **all** the posts from each seller and append them to the tableData
func getAllPostsFromSellerAndReloadCollectionView() {

    let dispatchGroup = DispatchGroup()

    for seller in arrOfSellers {

        dispatchGroup.enter()

        let postsRef = Database.database().reference().child("posts").child(seller.sellerId!)
        postsRef.observeSingleEvent(of: .value, with: {(snapshot) in

            guard let dictionaries = snapshot.value as? [String: Any] else { dispatchGroup.leave(); return }

            for (key, value) in dictionaries {

                guard let dict = value as? [String: Any] else { continue }

                let post = Post(seller: seller, dict: dict)

                self?.tableData.append(post)
            }

            dispatchGroup.leave()
        })
        dispatchGroup.notify(queue: .global(qos: .background)) { [weak self] in

            // sort the tableData by postDate and reload collectionView on mainQueue
        }
    }
}

Модель продавца и почты

class Seller {
    var sellerId: String?
    var username: String?
    var profileURl: String?
    var email: String?
}

class Post {
    var postId: String?
    var postDate: Double?
    var seller: Seller?
    var item: String?
    var price: Double?
    var description: String?
}

К вашему сведению, я знаю, что могу отсортировать таблицу данных и обновить информацию на основе идентификатора postId и / или sellerId, но Я все ещене вижу, в какой момент я буду уведомлен о том, что в db было внесено изменение в продавца или его сообщение.Куда бы я добавил эти 2 функции?

func changeToSellerOccurredTo(_ sellerId: String) {

    for post in tableData {

         if post.seller!.sellerId! == sellerId {

             if let indexOfItem = tableData.index(where: { $0.seller.sellerId ?? "" == sellerId }) {

                 let post = tableData[indexOfItem]

                 // update this post here in HomeVC and send a Notification to the Price/DescriptionVC, ShoppingCartVC, and PaymentVC to update the change to the post's seller's property
             }
         }
    }
}

func changeToPostOccurredTo(_ postId: String) {

    for post in tableData {

         if post.postId! == postId {

             if let indexOfItem = tableData.index(where: { $0.postId ?? "" == postId }) {

                 let post = tableData[indexOfItem]

                 // update this post here in HomeVC and send a Notification to the Price/DescriptionVC, ShoppingCartVC, and PaymentVC to update the change to the post itself
             }
         }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...