Приложение «зависает» при открытии ВК и получении данных из Firebase - PullRequest
0 голосов
/ 04 января 2019

Я столкнулся с проблемой, ведущей себя так. При открытии нового VC, который получает несколько изображений из Firebase Storage (в данном случае 9 изображений, каждое изображение занимает несколько килобайт), и получает небольшое количество документов из Firestore, приложение как бы зависает примерно на 2-4 секунды, прежде чем открытие и отображение вида. У меня есть контроллер панели вкладок, и я не могу нажать на любой другой элемент панели вкладок, пока не отобразится представление.

У меня есть все ссылки на Firebase и вызов функции внутри viewWillAppear. Я также пытался поместить все в ViewDidLoad и viewDidAppear, но у меня такое же зависание.

Есть ли решение для этого, я делаю что-то не так или мне просто нужно с этим жить?

У меня последняя версия Firebase, я использую swift 4 и у меня есть интернет-соединение 1000 Мб.

var db: Firestore!

override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(true)
    tableView.delegate = self
    tableView.dataSource = self

    db = Firestore.firestore()
    getTasks()
    tableView.reloadData()
}

func getTasks() {

    db.collection("School").document(school).collection("Projects").document((project?.projectId)!).collection("Tasks").whereField("Completed", isEqualTo: false).addSnapshotListener { (snapshot, error) in
        if let error = error {
            print(error)
        } else {
            self.tasks = snapshot!.documents.compactMap({TaskModel(dictonary: $0.data())})
            self.tableView.reloadData()
        }
    }
}

Ответы [ 2 ]

0 голосов
/ 04 января 2019

Посмотрите, как ваш код извлекает все изображения перед представлением этого представления, поэтому оно зависает. Если вы использовали firebase, вы должны понимать, что он загружает все подузлы, присутствующие в вашем главном узле.

Решение: - Один из способов решить проблему замораживания - вызвать функцию getTasks () в функции viewdidAppear (). Таким образом, вы сможете получить доступ к своему представлению, когда оно будет одновременно загружать данные. Также Вы можете использовать индикатор активности, чтобы указать, что данные загружаются.

0 голосов
/ 04 января 2019

Похоже, вы выбираете данные из основного потока (который блокирует пользовательский интерфейс). используйте GCD для получения асинхронных данных, а затем перезагрузите табличное представление.

DispatchQueue.global(qos: .background).async { 

    self.getTasks()
    DispatchQueue.main.async { 
       self.tableView.reloadData()
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...