Длительное время зависания при получении сообщений из Firebase на физическом устройствеIOS

Программируем под IOS
Ответить
Anonymous
 Длительное время зависания при получении сообщений из Firebase на физическом устройстве

Сообщение Anonymous »

Главное представление (или любое представление с заполненными сообщениями) работает очень медленно, и после отладки я обнаружил, что фильтрация НЕ является причиной проблемы. По какой-то причине в симуляторе он не медленный, но на реальном устройстве он очень медленный, особенно после загрузки сообщений.
У меня есть «FullPostCell» и «PostCell» для заполнить ForEach. Когда вы пытаетесь вернуться к представлению с сообщениями из «FullPostCell», после нажатия на стрелку навигации требуется несколько секунд, чтобы закрыть и вернуться назад.
Я также отладил кучу раз, и я до сих пор не могу понять эту проблему, в отладках ничего не показывает, что ее вызывает, но я предполагаю, что это проблема с узким местом.

Код: Выделить всё

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
}

guard let documents = snapshot?.documents else {
DispatchQueue.main.async {
completion(.success([]))
}
return
}

var posts: [Post] = []

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 post = Post(id: document.documentID, userId: userId, parentId: parentId, groupId: groupId, text: text, imageUrl: imageUrl, videoUrl: videoUrl, timestamp: timestamp.dateValue(), isPinned: isPinned, likedBy: [], views: views)

posts.append(post)
}

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))
}
}
}
}
}

func refreshPosts(completion: @escaping (Result) -> Void) {
cachedPosts = []
fetchPosts(completion: completion)
}

let viewWeight: Double = 0.5
let timestampWeight: Double = 1.2
let likesWeight: Double = 0.9

let cutoffDate = Calendar.current.date(byAdding: .day, value: -1, to: Date()) ?? Date()

let sortedPostsForYou = viewModel.posts
.filter { !$0.user.privateProfile && $0.post.parentId.isEmpty && $0.post.groupId.isEmpty }
.sorted { post1, post2 in
let likesCount1 = likeViewModel.likes.filter { $0.like.postId == post1.post.id }.count
let likesCount2 = likeViewModel.likes.filter { $0.like.postId == post2.post.id }.count

let score1 = Double(post1.post.views) * viewWeight
+ post1.post.timestamp.timeIntervalSince(cutoffDate) / 3600 * timestampWeight
+ Double(likesCount1) * likesWeight

let score2 = Double(post2.post.views) * viewWeight
+ post2.post.timestamp.timeIntervalSince(cutoffDate) / 3600 * timestampWeight
+ Double(likesCount2) * likesWeight

return score1 >  score2
}

ForEach(sortedPostsForYou) { post in
PostCell(postWithUser: post, appData: appData)
.id(post.id)
.onAppear {
lastViewedPostId = post.id
}
}
.padding(.top, 17)
Я уже несколько дней решаю эту проблему, может кто-нибудь помочь?

Подробнее здесь: https://stackoverflow.com/questions/786 ... cal-device
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «IOS»