Я создаю приложение для социальных сетей, и, так как я не смог решить это самостоятельно, мне нужна помощь.
Я подключил свой проект Xcode к Firebase и сделал возможным для моих пользователейзарегистрируйтесь / войдите в систему и опубликуйте сообщения в Firebase, которые затем будут показаны все вместе в одной группе TableView, но никакие данные не будут связаны с пользователем, который опубликовал это сообщение.Идея заключается в том, что он похож на посты в Instagram, но каждый пост в моем приложении должен включать только: Фото и подпись (необязательно), которые являются частью класса сообщений, и CraftName, который является частью класса пользователей.Я считаю, что проблема заключается в «денормализации» и неправильном заполнении tableView.
Вот фотография моего дерева Firebase, в котором на данный момент зарегистрировано 2 пользователя. Один опубликовал 1 публикацию, а другой опубликовал 2 сообщения
https://i.imgur.com/fc2LEMk.jpg
Я успешно зарегистрировал пользователей (с электронной почтой, именем пользователя и CraftName) в базе данных firebase, и я дал им возможность войти в систему и выйти из нее, поэтому я считаю, что проблема заключается вгде-то еще, чтобы посмотреть.Я также сделал возможным опубликовать сообщение в Firebase, которое включает в себя фото и подпись, и заполнить tableView этими двумя объектами.Осталось только подключить пользователя к его сообщению и при отображении сообщения предоставить CraftName этого пользователя в виде TextView над сообщением.
Это класс AuthService, который занимается регистрацией
static func register(username: String, email: String, password: String, craftName: String, onSuccess: @escaping () -> Void, onError: @escaping (_ errorMessage: String?) -> Void) {
Auth.auth().createUser(withEmail: email, password: password, completion: { (user, error) in
if error != nil {
onError(error!.localizedDescription)
return
}
let uid = Auth.auth().currentUser!.uid
self.setUserInformation(username: username, email: email, craftName: craftName, uid: uid, onSuccess: onSuccess)
})
}
Это класс регистрации
@IBAction func registerButtonPressed(_ sender: Any) {
view.endEditing(true)
AuthService.register(username: usernameTextField.text!, email: emailTextField.text!, password: passwordTextField.text!, craftName: craftNameTextField.text!, onSuccess: {
self.performSegue(withIdentifier: "registerToTabBar", sender: self)
}, onError: {error in
ProgressHUD.showError(error!)
})
}
}
//Stvaranje reference na Firebase Realtime bazu podataka i spremanje svih podataka svakog korisnika zasebno u tu bazu podataka
static func setUserInformation(username: String, email: String, craftName: String, uid: String, onSuccess: @escaping () -> Void){
let ref = Database.database().reference()
let usersReference = ref.child("users")
let newUserReference = usersReference.child(uid)
newUserReference.setValue(["username": username, "email": email, "craftName": craftName])
onSuccess()
}
}
Это мой класс пользователя
struct User {
var username: String?
var email: String?
var craftName: String
init(craftNameString: String, emailString : String, usernameString: String){
craftName = craftNameString
username = usernameString
email = emailString
}
}
Это мой класс сообщений
class Post {
var caption: String?
var photoUrl: String?
var numberOfClaps: Int?
init(captionText: String, photoUrlString: String) {
caption = captionText
photoUrl = photoUrlString
}
}
Этомой класс пользовательских сообщений
class PostCell: UITableViewCell {
@IBOutlet weak var postImageView: UIImageView!
@IBOutlet weak var captionTextViev: UITextView!
@IBOutlet weak var craftNameTextField: UITextView!
var post : Post! {
didSet{
self.updatePostUI()
}
}
var user : User! {
didSet{
self.updateUserUI()
}
}
func updatePostUI() {
captionTextViev.text = post.caption
}
func updateUserUI(){
craftNameTextField.text = user.craftName
}
}
Теперь, когда мои пользователи зарегистрированы, они могут публиковать сообщения в CameraClass.
@IBAction func shareButtonPressed(_ sender: Any) {
if let postImg = selectedImage, let imageData = postImg.jpegData(compressionQuality: 1) {
let photoIDString = NSUUID().uuidString
print(photoIDString)
let storageRef = Storage.storage().reference(forURL: Config.STORAGE_ROOT_REF).child("posts").child(photoIDString)
storageRef.putData(imageData, metadata: nil, completion: { (metadata, error) in
if error != nil {
ProgressHUD.showError(error?.localizedDescription)
return
}
storageRef.downloadURL(completion: { (url, error) in
if error != nil {
ProgressHUD.showError(error!.localizedDescription)
}else {
if let photoURL = url?.absoluteString{
self.sendDataToDatabase(photoUrl: photoURL)
}
}
})
})
}
}
func sendDataToDatabase(photoUrl: String) {
let ref = Database.database().reference()
let uid = Auth.auth().currentUser!.uid
let postsReference = ref.child("posts")
let userUID = postsReference.child(uid)
let newPostID = userUID.child(userUID.childByAutoId().key!)
newPostID.setValue(["photoUrl": photoUrl, "caption": captionTextView.text!], withCompletionBlock: { (error, ref) in
if error != nil {
ProgressHUD.showError(error!.localizedDescription)
return
}
ProgressHUD.show("Uspješno ste objavili fotografiju")
ProgressHUD.dismiss()
self.clean()
self.tabBarController?.selectedIndex = 0
})
Это мой HomeViewController, в котором находится tableView, который являетсядолжен отображать сообщения
class HomeViewController: UIViewController {
@IBOutlet weak var tableView: UITableView!
var posts = [Post]()
struct Storyboard {
static let postCellDefaultHeight : CGFloat = 578.0
}
override func viewDidLoad() {
super.viewDidLoad()
tableView.dataSource = self
tableView.estimatedRowHeight = Storyboard.postCellDefaultHeight
tableView.rowHeight = UITableView.automaticDimension
tableView.separatorColor = UIColor.clear
loadPosts()
}
//Function which is supposed to retrieve data from database and populate the TableView
func loadPosts() {
let ref = Database.database().reference()
let posts = ref.child("posts")
posts.observe(.value) { (snapshot) in
for currentUser in (snapshot.children) {
let cUSer = currentUser as! DataSnapshot
for postInfo in (cUSer.children) {
let postSnap = postInfo as! DataSnapshot
let dict = postSnap.value as? [String: Any]
let captionText = dict!["caption"] as! String
let photoUrlString = dict!["photoUrl"] as! String
let post = Post(captionText: captionText, photoUrlString: photoUrlString)
self.posts.append(post)
self.tableView.reloadData()
}
}
}
}
Прямо сейчас это выглядит так: https://i.imgur.com/lMxZYLW.jpg
Вот как я бы хотел, чтобы это выглядело: https://i.imgur.com/721mEXm.jpg