Обновите свой интерфейс в главном потоке.

ичок в разработке для iOS и хочу создать приложение-клон instagram, и у меня возникла проблема при создании новостной ленты для приложения-клона instagram.

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

Но когда я запускаю приложение, фиктивное изображение и метка из моей раскадровки перекрывают загруженные данные, которые я помещаю в табличное представление. данные, которые я загружаю, в конечном итоге будут отображаться после прокрутки вниз.

Вот gif, когда я запускаю приложение:

http://g.recordit.co/iGIybD9Pur.gif

Есть 3 пользователей, которые показывают в .gif

имя пользователя (манекен из раскадровки)JokowiRIMegawatiRI

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

Я считаю, что MegawatiRI успешно загружен, но я не знаю, почему фиктивное изображение кажется перекрывающим фактические данные. Я не хочу, чтобы манекен показывался при запуске моего приложения.

Вот скриншот ячейки прототипа:

А вот упрощенные коды контроллера табличного представления:

class NewsFeedTableViewController: UITableViewController {


    var currentUser : User!
    var media = [Media]()



    override func viewDidLoad() {
        super.viewDidLoad()



        tabBarController?.delegate = self


        // to set the dynamic height of table view
        tableView.estimatedRowHeight = StoryBoard.mediaCellDefaultHeight
        tableView.rowHeight = UITableViewAutomaticDimension

        // to erase the separator in the table view
        tableView.separatorColor = UIColor.clear

    }


    override func viewWillAppear(_ animated: Bool) {

        // check wheter the user has already logged in or not

        Auth.auth().addStateDidChangeListener { (auth, user) in

            if let user = user {

                RealTimeDatabaseReference.users(uid: user.uid).reference().observeSingleEvent(of: .value, with: { (snapshot) in

                    if let userDict = snapshot.value as? [String:Any] {
                        self.currentUser = User(dictionary: userDict)
                    }


                })

            } else {
                // user not logged in
                self.performSegue(withIdentifier: StoryBoard.showWelcomeScreen, sender: nil)
            }


        }

        tableView.reloadData()
        fetchMedia()



    }




    func fetchMedia() {

    SVProgressHUD.show()

    Media.observeNewMedia { (mediaData) in


        if !self.media.contains(mediaData) {
            self.media.insert(mediaData, at: 0)
            self.tableView.reloadData()
            SVProgressHUD.dismiss()
        }


        }

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

        let cell = tableView.dequeueReusableCell(withIdentifier: StoryBoard.mediaCell, for: indexPath) as! MediaTableViewCell


        cell.currentUser = currentUser
        cell.media = media[indexPath.section]



        // to remove table view highlight style
        cell.selectionStyle = .none



        return cell
    }


    }

А вот упрощенный код ячейки табличного представления:

class MediaTableViewCell: UITableViewCell {

    var currentUser: User!
    var media: Media! {
        didSet {

            if currentUser != nil {
                updateUI()
            }

        }
    }

    var cache = SAMCache.shared()



    func updateUI () {


        // check, if the image has already been downloaded and cached then just used the image, otherwise download from firebase storage


        self.mediaImageView.image = nil
        let cacheKey = "\(self.media.mediaUID))-postImage"

        if let image = cache?.object(forKey: cacheKey) as? UIImage {
            mediaImageView.image = image
        } else {
            media.downloadMediaImage { [weak self] (image, error) in

                if error != nil {
                    print(error!)
                }


                if let image = image {
                    self?.mediaImageView.image = image
                    self?.cache?.setObject(image, forKey: cacheKey)

                }


            }

        }

Так что же делает фиктивное изображение перекрывающим мои загруженные данные?

Ответы на вопрос(2)

Ваш ответ на вопрос