Как я могу подключить сообщение к пользователю и отобразить этого пользователя и опубликовать данные в пользовательской ячейке в TableView с помощью Firebase - PullRequest
0 голосов
/ 27 января 2019

Я создаю приложение для социальных сетей, и, так как я не смог решить это самостоятельно, мне нужна помощь.

Я подключил свой проект 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...