Что написать в функции, чтобы сортировка была по условию?
Пишу приложение на swiftui с использованием Firebase. Сейчас сортировка документов идет по дате публикации. Нужно, чтобы на первом месте показывались документы, которые в базе Firebase содержат не пустой массив upPostPlusDay. Вот код. Модель для записи данных в базу Post:
import SwiftUI
import FirebaseFirestoreSwift
struct Post: Identifiable, Codable, Equatable, Hashable {
@DocumentID var id: String?
var text: String
var postHead: String
var postAddress: String
var imageURL: URL?
var imageReferenceID: String = ""
var publishedDate: Date = Date()
var likedIDs: [String] = []
var dislikedIDs: [String] = []
var plusFavorites: [String] = []
var upPostPlusDay: [Int] = []
var userName: String
var userUID: String
var userProfileURL: URL
var userBioLink: String
enum CodingKeys: CodingKey {
case id
case text
case postHead
case postAddress
case imageURL
case imageReferenceID
case publishedDate
case likedIDs
case dislikedIDs
case plusFavorites
case upPostPlusDay
case userName
case userUID
case userProfileURL
case userBioLink
}
}
Код вывода пользователю:
import SwiftUI
import Firebase
struct ReusablePostViewContentView: View {
var basedOnUID: Bool = false
var uid: String = ""
@Binding var posts: [Post]
@State private var isFetching: Bool = true
@State private var paginationDoc: QueryDocumentSnapshot?
var body: some View {
ScrollView (.vertical, showsIndicators: false) {
LazyVStack {
if isFetching {
ProgressView()
.padding(.top, 30)
} else {
if posts.isEmpty {
Text("Записи отсутствуют")
.font(.caption)
.foregroundColor(.gray)
.padding(.top, 30)
} else {
Posts()
}
}
}
.padding(15)
}
.refreshable {
guard !basedOnUID else {return}
isFetching = true
posts = []
paginationDoc = nil
await fetchPosts()
}
.task {
guard posts.isEmpty else {return}
await fetchPosts()
}
}
@ViewBuilder
func Posts() -> some View {
ForEach (posts) { post in
PostCardViewContentView(postDog: post) { updatedPost in
if let index = posts.firstIndex(where: { post in
post.id == updatedPost.id
}) {
posts[index].likedIDs = updatedPost.likedIDs
posts[index].dislikedIDs = updatedPost.dislikedIDs
}
} onDelete: {
withAnimation(.easeInOut(duration: 0.25)) {
posts.removeAll {post.id == $0.id}
}
}
.onAppear {
if post.id == posts.last?.id && paginationDoc != nil {
Task {await fetchPosts()}
// print("Получить новые записи")
}
}
Divider()
.padding(.horizontal, -15)
}
}
func fetchPosts() async {
do {
var query: Query!
if let paginationDoc {
query = Firestore.firestore().collection("Posts")
.order(by: "publishedDate", descending: true)
.start(afterDocument: paginationDoc)
.limit(to: 5)
} else {
query = Firestore.firestore().collection("Posts")
.order(by: "publishedDate", descending: true)
.limit(to: 5)
}
if basedOnUID {
query = query.whereField("userUID", isEqualTo: uid)
}
let docs = try await query.getDocuments()
let fetchedPosts = docs.documents.compactMap { doc -> Post? in
try? doc.data(as: Post.self)
}
await MainActor.run(body: {
posts.append(contentsOf: fetchedPosts)
paginationDoc = docs.documents.last
isFetching = false
})
} catch {
print(error.localizedDescription)
}
}
}
Помогите, пожалуйста.