TableView не отображает данные Firebase в xcode (swiift)

#ios #swift #xcode #firebase #tableview

#iOS #swift #xcode #firebase #tableview

Вопрос:

Я использую Xcode 11, чтобы попытаться отобразить данные ‘post’ в Firebase в tableview, и я протестировал вызов информации с помощью printsкоторый работает.

Это мой код для контроллера представления таблицы:

 import UIKit
import Firebase
import FirebaseDatabase
import SwiftKeychainWrapper
import FirebaseAuth

class FeedVC: UITableViewController {
    
    var currentUserImageUrl: String!
    var posts = [Post]()
    var selectedPost: Post!

    override func viewDidLoad() {
        super.viewDidLoad()
        getUsersData()
        getPosts()
        // Do any additional setup after loading the view.
        
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }
    
    
    func getUsersData(){

        guard let userID = Auth.auth().currentUser?.uid else { return }
        Database.database().reference().child("users").child(userID).observeSingleEvent(of: .value) { (snapshot) in
            if let postDict = snapshot.value as? [String : AnyObject] {
                self.tableView.reloadData()
            }
        }
    }
    
    func getPosts() {
        Database.database().reference().child("textPosts").observeSingleEvent(of: .value) { (snapshot) in
            guard let snapshot = snapshot.children.allObjects as? [DataSnapshot] else { return }
            self.posts.removeAll()
            for data in snapshot.reversed() {
                guard let postDict = data.value as? Dictionary<String, AnyObject> else { return }
                let post = Post(postKey: data.key, postData: postDict)
                print(DataSnapshot.self)
                self.posts.append(post)
            }
            self.tableView.reloadData()
        }
    }
    
    override func numberOfSections(in tableView: UITableView) -> Int {
        return 1
    }
    
    override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return posts.count
    }
    
    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        
        
        guard let cell = tableView.dequeueReusableCell(withIdentifier: "postCell") as? PostCell else { return UITableViewCell() }
        
        cell.configCell(post: posts[indexPath.row])
        return cell
    }
}
  

Это код для PostCell:

 import UIKit
import Firebase
import FirebaseStorage
import FirebaseDatabase
import SwiftKeychainWrapper

class PostCell: UITableViewCell {
    
    @IBOutlet weak var userImg: UIImageView!
    @IBOutlet weak var username: UILabel!
    @IBOutlet weak var postText: UILabel!
    @IBOutlet weak var commentBtn: UIButton!
    
    var post: Post!
    let currentUser = KeychainWrapper.standard.string(forKey: "uid")
    
    func configCell(post: Post) {
        self.post = post
        self.username.text = post.username
        self.postText.text = post.postText
        print(self.post)
        print(self.post.username)
        
        let ref = Storage.storage().reference(forURL: post.userImg)
        ref.getData(maxSize: 100000000, completion: { (data, error) in
            if error != nil {
                print("couldnt load img")
            } else {
                if let imgData = data {
                    if let img = UIImage(data: imgData){
                        self.userImg.image = img
                    }
                }
                }
        })
    }} 
  

и это для публикации:

 import Foundation
import Firebase
import FirebaseDatabase

class Post {
    private var _username: String!
    private var _userImg: String!
    private var _postText: String!
    private var _postKey:  String!
    private var _postRef: DatabaseReference!
    
    var username: String {
        return _username
    }
    
    var userImg: String {
        return _userImg
    }
    
    var postText: String {
        return _postText
    }
    
    var postKey: String {
        return _postKey
    }
    
    init(postText: String, username: String, userImg: String) {
        _postText = postText
        _username = username
        _userImg = userImg
    }
    
    init(postKey: String, postData: Dictionary<String, AnyObject>) {
        _postKey = postKey
        
        if let username = postData["username"] as? String {
            _username = username
        }
        
        if let userImg = postData["userImg"] as? String {
            _userImg = userImg
        }
        
        if let postText = postData["postText"] as? String {
            _postText = postText
        }
        
        _postRef = Database.database().reference().child("posts").child(_postKey)
    }
}
  

Я застрял на этом некоторое время, и любая помощь была бы высоко оценена!

Комментарии:

1. Попробуйте поместить self.tableView.reloadData() внутрь DispatchQueue.main.async .

2. Вы используете observeSingleEvent внутри getPosts(), который запускает обратный вызов только один раз. Если вы хотите получать часто обновляемые данные, используйте observe .

3. @Rikh Я не использовал DispatchQueue, и мой tableview отлично работает с firebase. Я не понимаю, почему это должно потребоваться. Я просто перезагружаю таблицу всякий раз, когда готов новый снимок

Ответ №1:

Вы проверили, вызываются ли методы источника данных? Также, пожалуйста, подтвердите, есть ли у ваших ячеек высота.