Главное представление (или любое представление с заполненными сообщениями) работает очень медленно, и после отладки я обнаружил, что фильтрация НЕ является причиной проблемы. По какой-то причине в симуляторе он не медленный, но на реальном устройстве он очень медленный, особенно после загрузки сообщений.
У меня есть «FullPostCell» и «PostCell» для заполнить ForEach. Когда вы пытаетесь вернуться к представлению с сообщениями из «FullPostCell», после нажатия на стрелку навигации требуется несколько секунд, чтобы закрыть и вернуться назад.
Я также отладил кучу раз, и я до сих пор не могу понять эту проблему, в отладках ничего не показывает, что ее вызывает, но я предполагаю, что это проблема с узким местом.
Главное представление (или любое представление с заполненными сообщениями) работает очень медленно, и после отладки я обнаружил, что фильтрация НЕ является причиной проблемы. По какой-то причине в симуляторе он не медленный, но на реальном устройстве он очень медленный, особенно после загрузки сообщений. У меня есть «FullPostCell» и «PostCell» для заполнить ForEach. Когда вы пытаетесь вернуться к представлению с сообщениями из «FullPostCell», после нажатия на стрелку навигации требуется несколько секунд, чтобы закрыть и вернуться назад. Я также отладил кучу раз, и я до сих пор не могу понять эту проблему, в отладках ничего не показывает, что ее вызывает, но я предполагаю, что это проблема с узким местом. [code]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 { DispatchQueue.main.async { completion(.failure(error)) } return }
for document in documents { 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 { continue }
let userIds = Set(posts.map { $0.userId }) UserService.shared.fetchUsers(userIds: Array(userIds)) { result in switch result { case .success(let users): let userDict = Dictionary(uniqueKeysWithValues: users.map { ($0.id, $0) }) let postsWithUsers = posts.map { post in if let user = userDict[post.userId] { return PostWithUser(post: post, user: user) } else { return PostWithUser(post: post, user: MockData.mockUser) } } self.cachedPosts = postsWithUsers DispatchQueue.main.async { completion(.success(postsWithUsers)) } case .failure(let error): DispatchQueue.main.async { completion(.failure(error)) } } } } }
ForEach(sortedPostsForYou) { post in PostCell(postWithUser: post, appData: appData) .id(post.id) .onAppear { lastViewedPostId = post.id } } .padding(.top, 17) [/code] Я уже несколько дней решаю эту проблему, может кто-нибудь помочь?