В моем приложении пользователи могут продавать предметы.Покупатель запрашивает их площадь (например, радиус 1 миля) и получает всех продавцов в этой области, и появляются все сообщения / предметы, которые продавцы имеют для продажи.
Как только покупатель видит товар, он может щелкнутьВ ячейке отобразится новый виртуальный канал, и они увидят цену и описание. Оттуда они могут добавить товар в корзину, в которой будет показан другой виртуальный канал, и оттуда перейти на другой виртуальный канал, чтобы произвести оплату за элемент..
HomeVC > Price/DescriptionVC > ShoppingCartVC > PaymentVC
HomeVC - это место, где все данные изначально извлекаются из базы данных.Когда данные возвращаются, может быть несколько продавцов, у каждого из которых есть несколько постов / предметов для продажи (которые все показаны).
Если покупатель находится в VC «Цена / Описание» (или любой из следующих vcs) иодин из продавцов меняет свое имя пользователя или цену просматриваемого товара, как мне отслеживать эту информацию в db , чтобы обновить виртуальный канал, чтобы отразить изменение в информации?
Например, покупатель находится на VC «Цена / Описание» и просматривает пару коньков по 10 долларов от продавца по имени Питер.Питер меняет свое имя на Пола и увеличивает цену на коньки до 20 долларов.Я думаю, что эти изменения теперь должны быть обновлены в Price / DescriptionVC, чтобы покупатель заплатил новую цену в 20 долларов за человека по имени Пол, а не 10 долларов за человека по имени Питер.
Код ниже:
- получить все идентификаторы продавца в радиусе 1 мили от покупателя и добавить их в arrOfSellerIds
- перейти к sellersRef и получить идентификатор продавца, имя пользователя, profileUrl, а также адрес электронной почты идобавьте их в arrOfSellers
- , перейдите к 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
}
}
}
}