func fetchNextPage() async {
guard !isLoading, !reachedEnd else { return }
isLoading = true
defer { isLoading = false }
let excluded = Array(BlockService.shared.blocked.prefix(10))
var query = db.collection("posts")
.whereField("isReply", isEqualTo: false)
.order(by: "timestamp", descending: true)
if !excluded.isEmpty {
query = query.whereField("ownerUid", notIn: excluded)
}
if let lastDoc { query = query.start(afterDocument: lastDoc) }
query = query.limit(to: pageSize)
do {
let snap = try await query.getDocuments()
guard !snap.documents.isEmpty else {
reachedEnd = true
return
}
let items = snap.documents.compactMap { try? $0.data(as: Post.self) }
let posts = await PostService.hydratePosts(items)
self.posts.append(contentsOf: posts)
lastDoc = snap.documents.last
if snap.documents.count < pageSize { reachedEnd = true }
} catch {
Crashlytics.crashlytics().record(error: error)
#if DEBUG
print("DEBUG: Unable to fetch posts with error: \(error.localizedDescription)")
#endif
}
}
Currently, Firestore’s not-in operator is limited to 10 values, which restricts users from blocking more than 10 others. Is there an efficient way to work around this limitation and support unlimited blocked users? I don't want to filter client side. I want to keep everything a query so I can implement Firestore rules.