Обновите свой интерфейс в главном потоке.
ичок в разработке для 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)
}
}
}
Так что же делает фиктивное изображение перекрывающим мои загруженные данные?