#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:
Вы проверили, вызываются ли методы источника данных? Также, пожалуйста, подтвердите, есть ли у ваших ячеек высота.