У меня есть UITableViewCell
с пользовательским методом делегата, didJoinGroupConvo
.Я делаю обновление для Firestore, и когда я это делаю, пользовательский интерфейс блокируется, если я прокручиваю, пока идет обновление.
Как я могу исправить эту блокировку основного потока, чтобы пользователь имел самый гладкий (каламбур) опыт?
func didJoinGroupConvo(groupConvoId: String) {
guard !joinedGroupConvoIds.contains(groupConvoId) else { return }
joinedGroupConvoIds.append(groupConvoId)
guard
let row = suggestedGroups.firstIndex(where: { $0.id == groupConvoId }),
let cell = tableView.cellForRow(at: IndexPath(row: row, section: 0)) as? GroupMessageSettingsUserCell,
let currentUser = PFUser.current(),
let currentUserId = currentUser.objectId,
let currentUsername = currentUser.username
else { return }
// If I comment out starting here, it won't block. Otherwise, as long as it's doing this call, it will block the UI
DispatchQueue.global(qos: .background).async {
Firestore.Collections.groupConvos.path
.document(groupConvoId)
.updateData([
kMemberIds: FieldValue.arrayUnion([currentUserId]),
kUpdatedAt: FieldValue.serverTimestamp()
]) { [weak self] error in
guard let self = self else { return }
if error == nil {
guard row < self.suggestedGroups.count else { return }
let groupConvo = self.suggestedGroups[row]
NotificationCenter.default.post(name: NSNotification.Name("Joined"), object: groupConvo)
DispatchQueue.main.async {
cell.nameLabel?.text = "\(groupConvo.memberCount + 1) members"
}
let message = GroupMessage.createJoinLeftSystemMessage(joined: true, groupName: groupConvo.groupName, username: currentUsername)
message.saveMessage(to: groupConvo, withMessageType: .system) { _ in
self.delegate?.didJoinGroup(withGroupId: groupConvoId)
}
}
}
}
}