нету идей как решить эту задачу правильно, цель - на экране должны отображаться только те новости, категории которых соответствуют выбранным пользователем (в модели юзера есть массив topic = [sport, business, money, article])
.
Получается есть новость, например с полем topic = “sport”, и есть пользователь, который выбрал такую же категорию “sport”, как мне правильно составить запрос, чтобы это работало? Вот мой код:
func loadFirstData(page: Int, completion: @escaping ([NewsModel]?, Error?)-> Void) {
self.getUserTopics { (userTopics) in // получаю категории юзера
if let topics = userTopics, !topics.isEmpty {
// topics = три темы [politics, sport, money]
}
}
// мой запрос, достаю news, сортирую по дате и далее просто передаю первые 10 новостей, здесь должно быть по идее так, достается news, сортируется по категориям, будут браться только категории из массива topics с метода getUserTopics, и сортироваться по дате
database.collection(kCollectionNews).order(by: kQueryOrderFieldTimestamp, descending: true).limit(to: page).getDocuments(completion: { (snapshot, error) in
if let error = error {
completion(nil, error)
return
}
if snapshot?.count ?? 0 < page {
self.lastSnapshot = nil
} else {
self.lastSnapshot = snapshot?.documents.last
}
let news = (snapshot?.documents.compactMap( { NewsModel(dictionary: $0.data())} ))
completion(news, nil)
})
}
Проблема: пробовал обвернуть в массив, но получается что все первые новости одного типа и нельзя отсортировать по дате в запросе, как мне правильно это сделать? Вот мои попытки:
func loadFirstData(page: Int, completion: @escaping ([NewsModel]?, Error?)-> Void) {
self.getUserTopics { (userTopics) in
if let topics = userTopics, !topics.isEmpty {
topics.forEach( {
self.database.collection(kCollectionNews).whereField("topic", isEqualTo: $0).limit(to: page).getDocuments(completion: { (snapshot, error) in
if let error = error {
completion(nil, error)
return
}
if snapshot?.count ?? 0 < page {
self.lastSnapshot = nil
} else {
self.lastSnapshot = snapshot?.documents.last
}
let news = snapshot?.documents.compactMap( { NewsModel(dictionary: $0.data()) })
completion(news, nil)
})
})
}
}
}