Главное представление (или любое представление с заполненными сообщениями) работает очень медленно, и после отладки я обнаружил, что фильтрация НЕ является причиной проблемы. По какой-то причине на симуляторе он не медленный, но на реальном устройстве он очень медленный, особенно после загрузки постов.
Я тоже отлаживал кучу раз, но до сих пор не могу в этом разобраться проблема, в отладках ничего не указывает на ее причину, но я думаю, что это проблема с узким местом.
import Foundation
import SwiftUI
import Firebase
class PostViewModel: ObservableObject {
@Published var posts: [PostWithUser] = []
let db = Firestore.firestore()
@MainActor
func fetchPosts() {
PostService.shared.fetchPosts { result in
DispatchQueue.main.async {
switch result {
case .success(let posts):
self.posts = posts
case .failure(let error):
print("Failed to fetch posts: \(error)")
}
}
}
}
func refreshPosts() {
PostService.shared.refreshPosts { result in
DispatchQueue.main.async {
switch result {
case .success(let posts):
self.posts = posts
case .failure(let error):
print("Failed to fetch posts: \(error)")
}
}
}
}
private func fetchUserProfiles(for posts: [Post]) {
let userIds = Set(posts.map { $0.userId })
UserService.shared.fetchUsers(userIds: Array(userIds)) { result in
DispatchQueue.main.async {
switch result {
case .success(let users):
let userDict = Dictionary(uniqueKeysWithValues: users.map { ($0.id, $0) })
self.posts = posts.map { post in
if let user = userDict[post.userId] {
return PostWithUser(post: post, user: user)
} else {
return PostWithUser(post: post, user: MockData.mockUser)
}
}
case .failure(let error):
print("Failed to fetch user profiles: \(error)")
}
}
}
}
func deletePost(postId: String) {
PostService.shared.deletePost(postId: postId) { result in
switch result {
case .success:
print("post deleted")
case .failure(let error):
print("Failed to delete post: \(error.localizedDescription)")
}
}
}
}
Главное представление (или любое представление с заполненными сообщениями) работает очень медленно, и после отладки я обнаружил, что фильтрация НЕ является причиной проблемы. По какой-то причине на симуляторе он не медленный, но на реальном устройстве он очень медленный, особенно после загрузки постов. Я тоже отлаживал кучу раз, но до сих пор не могу в этом разобраться проблема, в отладках ничего не указывает на ее причину, но я думаю, что это проблема с узким местом. [code]import SwiftUI
[/code] [code]import Foundation import SwiftUI import Firebase
class PostViewModel: ObservableObject { @Published var posts: [PostWithUser] = []
let db = Firestore.firestore()
@MainActor func fetchPosts() { PostService.shared.fetchPosts { result in DispatchQueue.main.async { switch result { case .success(let posts): self.posts = posts case .failure(let error): print("Failed to fetch posts: \(error)") } } } }
func refreshPosts() { PostService.shared.refreshPosts { result in DispatchQueue.main.async { switch result { case .success(let posts): self.posts = posts case .failure(let error): print("Failed to fetch posts: \(error)") } } } }
private func fetchUserProfiles(for posts: [Post]) { let userIds = Set(posts.map { $0.userId }) UserService.shared.fetchUsers(userIds: Array(userIds)) { result in DispatchQueue.main.async { switch result { case .success(let users): let userDict = Dictionary(uniqueKeysWithValues: users.map { ($0.id, $0) }) self.posts = posts.map { post in if let user = userDict[post.userId] { return PostWithUser(post: post, user: user) } else { return PostWithUser(post: post, user: MockData.mockUser) } } case .failure(let error): print("Failed to fetch user profiles: \(error)") } } } }
func deletePost(postId: String) { PostService.shared.deletePost(postId: postId) { result in switch result { case .success: print("post deleted") case .failure(let error): print("Failed to delete post: \(error.localizedDescription)") } } } }
class PostService { static let shared = PostService() let db = Firestore.firestore() let postsRef = Firestore.firestore().collection("posts") let usersRef = Firestore.firestore().collection("users") let storageRef = Storage.storage().reference() private var cachedPosts: [PostWithUser] = []
do { // Ensure the video file is accessible let videoData = try Data(contentsOf: videoURL)
// Upload video using data videoRef.putData(videoData, metadata: nil) { metadata, error in if let error = error { print("Failed to upload video: \(error.localizedDescription)") completion(.failure(error)) return }
videoRef.downloadURL { url, error in if let error = error { print("Failed to get video URL: \(error.localizedDescription)") completion(.failure(error)) } else if let videoUrl = url?.absoluteString { print("Video uploaded successfully: \(videoUrl)") completion(.success(videoUrl)) } else { print("Failed to get video URL: Unknown error") completion(.failure(NSError(domain: "PostService", code: -1, userInfo: [NSLocalizedDescriptionKey: "Failed to get download URL."]))) } } } } catch { print("Failed to access video file: \(error.localizedDescription)") completion(.failure(error)) } }
postsRef.document(postId).setData(postData) { error in if let error = error { completion(.failure(error)) } else { completion(.success(())) } } }
func incrementPostViewCount(postId: String) { let postRef = postsRef.document(postId) postRef.updateData(["views": FirebaseFirestore.FieldValue.increment(Int64(1))]) { error in if let error = error { print("Error updating views: \(error.localizedDescription)") } else { print("Views updated successfully!") } } }
func fetchPosts(completion: @escaping (Result) -> Void) { if !cachedPosts.isEmpty { completion(.success(cachedPosts)) return } postsRef.order(by: "timestamp", descending: true).getDocuments { snapshot, error in if let error = error { completion(.failure(error)) return }
guard let documents = snapshot?.documents else { completion(.success([])) return }
let group = DispatchGroup() var postsWithUsers: [PostWithUser] = []
for document in documents { group.enter() let data = document.data() guard let userId = data["userId"] as? String, let parentId = data["parentId"] as? String, let groupId = data["groupId"] as? String, let text = data["text"] as? String, let imageUrl = data["imageUrl"] as? String, let videoUrl = data["videoUrl"] as? String, let isPinned = data["isPinned"] as? Bool, let timestamp = data["timestamp"] as? Timestamp, let views = data["views"] as? Int else { group.leave() continue }
) postsWithUsers.append(PostWithUser(post: post, user: user)) } else { print("Failed to fetch user data for userId: \(userId), error: \(String(describing: error))") } } }
postRef.getDocument { document, error in if let error = error { completion(.failure(error)) return }
guard let document = document, document.exists else { completion(.failure(NSError(domain: "PostService", code: -1, userInfo: [NSLocalizedDescriptionKey: "Post not found."]))) return }
let data = document.data() if data?["imageUrl"] is String { let imageRef = self.storageRef.child("post_images/\(postId).jpg") imageRef.delete { error in if let error = error { print("Failed to delete image: \(error.localizedDescription)") } } }
postRef.delete { error in if let error = error { completion(.failure(error)) } else { self.cachedPosts.removeAll { $0.post.id == postId } completion(.success(())) } } } } }
[/code] Я уже несколько часов сталкиваюсь с этой проблемой. Может кто-нибудь помочь?
Я перемещаюсь по своему представлению SwiftUI из UIKit и пытаюсь отключить обратное пролистывание. Я провел некоторые исследования и разработки, у меня код не работает. Я хотел отключить только один контроллер, а не весь контроллер.
Минимальная...
Я перемещаюсь по своему представлению SwiftUI из UIKit и пытаюсь отключить обратное пролистывание. Я провел некоторые исследования и разработки, у меня код не работает. Я хотел отключить только один контроллер, а не весь контроллер.
Минимальная...
Сейчас я пытаюсь настроить домашний веб-сервер с помощью переадресации портов. Я использую Next.js на порту 3000 и NGINX для передачи через прокси любого трафика с порта 8080 на моем компьютере на порт 3000. Я использую DNS Namecheap для подключения...
У меня есть приведенный ниже код, и я пытаюсь использовать входные данные, назначенные для low_bound и Upper_bound, в качестве аргументов для randint(). Однако я получаю ошибку на картинке. Я впервые работаю с Python. Мне нужно разработать эту...
Изображение, содержащее сообщение об ошибке
У меня есть приведенный ниже код, и я пытаюсь использовать входные данные, назначенные для low_bound и Upper_bound, в качестве аргументов для randint(). Однако я получаю ошибку на картинке. Я впервые...