После того, как ячейка обновляет базу данных, пользовательский интерфейс блокируется;как я могу исправить? - PullRequest
0 голосов
/ 05 февраля 2019

У меня есть 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)
                    }
                }
        }
    }
}
...