Отправить форму пользователям, использующим Firebase Realtime-Database - PullRequest
0 голосов
/ 06 августа 2020

Я почти закончил исправление огромной проблемы, которая возникла у меня последние несколько недель. Короче говоря, я пытаюсь отправить данные массива в мою базу данных Firebase. Я покажу, что в настоящее время отправляет кнопка отправки, когда я нажимаю кнопку отправки:

база данных

Я бы хотел, чтобы ноль был идентификатором каждого пользователя (по одному узлу для каждой строки). Количество пользователей и их личность определяется таблицей и дочерними значениями, которые должны быть значениями в массиве.

Вот код функции, которая отправляет в firebase:

@IBAction func sendButtonTapped(_ sender: Any) {
    
    let companyNameC = companyNameTextFieldConsiderations.text!.trimmingCharacters(in: .whitespacesAndNewlines)
    let companyDescriptionC = companyDescriptionTextFieldConsiderations.text!.trimmingCharacters(in: .whitespacesAndNewlines)
    
    let today = Date()
    let formatter1 = DateFormatter()
    formatter1.dateFormat = "MMM d y"
    print(formatter1.string(from: today))
    let todaysDate = formatter1.string(from: today)
            
    let storageRef = Storage.storage().reference(forURL: "MY STORAGE URL HERE")
    let imageName = companyNameTextFieldConsiderations.text!
    let storageCompanyRef = storageRef.child("Company_Image_Considerations").child("\(todaysDate)").child(imageName)
    let companyDescriptionTextFieldText = companyDescriptionTextFieldConsiderations.text
    let dateToStart = startDateTextFieldConsiderations.text
    let dateToDecide = endDateTextFieldConsiderations.text
    let companyRef = Database.database().reference().child("Considerations").child("\(todaysDate)").child(imageName)
    let numberOfPeopleCells = ConsiderationsTestViewController.people
    let considerationInfluencerRef = Database.database().reference().child("Considerations").child("\(todaysDate)").child(imageName).child("Users").child("\(numberOfPeopleCells.startIndex)")
    
     let values = ["Feed_Quantity": "feedTFC", "Story_Quantity": "storyTFC", "Compensation": "compensationTFC"]
    
        guard let imageSelected = self.CompanyImage.image else {
            print ("Avatar is nil")
            return
                }
                   
                var dict: Dictionary<String, Any> = [
                    "Company Image": "",
                    "Company Description": companyDescriptionTextFieldText!,
                    "Start Date": dateToStart!,
                    "Decision Date": dateToDecide! ]
    
                   
        guard let imageData = imageSelected.jpegData(compressionQuality: 0.5) else {
            return
                }
    
                let metadata = StorageMetadata()
                metadata.contentType = "image/jpeg"
                storageCompanyRef.putData(imageData, metadata: metadata, completion:
                { (StorageMetadata, error) in
                if (error != nil) {
                return
                    }
                            
                storageCompanyRef.downloadURL { (url, error) in
                if let metadateImage = url?.absoluteString {
                dict["Company Image"] = metadateImage
                   
                companyRef.updateChildValues(dict, withCompletionBlock:  {
                (error, ref) in
                if error == nil {
                print("Done")
                return
                    }
                  }
                )
               }
             }
                            
                                   storageRef.updateMetadata(metadata) { metadata, error in
                                    if error != nil {
                                    //Uh-oh, an error occurred!
                                    } else {
                                    // Updated metadata for 'images/forest.jpg' is returned
                                }
                            }
                        })
    
    considerationInfluencerRef.updateChildValues(values as [AnyHashable : Any]) { (error, ref) in
    if error != nil {
    print(error ?? "")
    return
                       }
    
self.navigationController?.popViewController(animated: true)
    }
}

Кажется, я не могу сослаться на atIndexPath.row. Затем я бы использовал UID из каждой ячейки для создания узла, а затем к каждому из данных indePath.row добавляли дочерние значения.

Каков наилучший способ действий?

EDIT: Вот структура для людей:

import UIKit

struct Person {
   var Name: String?
   var PostNumber: String?
   var StoryNumber: String?
   var Compensation: String?
   var ProfileImageUrl: String?
   var userID: String?
}

и вот код таблицы:

extension ConsiderationsTestViewController: UITableViewDelegate, UITableViewDataSource {
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    
    return ConsiderationsTestViewController.people.count
}

func numberOfSections(in tableView: UITableView) -> Int {
    return 1
}

func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
return 72
}

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

let cell = tableView.dequeueReusableCell(withIdentifier: AddPersonCell, for: indexPath) as! ConsiderationsCell
    
    let numberOfPeopleCells = ConsiderationsTestViewController.people[indexPath.row]
    
    
    cell.nameLabelC.text = numberOfPeopleCells.Name
    cell.feedLabelC.text = numberOfPeopleCells.PostNumber
    cell.storyLabelC.text = numberOfPeopleCells.StoryNumber
    cell.compensationLabelC.text = numberOfPeopleCells.Compensation
    cell.userImage.loadImageUsingCacheWithUrlString(urlString: numberOfPeopleCells.ProfileImageUrl!)
    
    cell.userImage.layer.cornerRadius = 25
    
    cell.nameLabelC.numberOfLines = 0
    
    return cell
}

func tableView(_ tableView: UITableView, canEditRowAt indexPath: IndexPath) -> Bool {
    return true
}

func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCell.EditingStyle, forRowAt indexPath: IndexPath) {
    if (editingStyle == .delete) {
        
        ConsiderationsTestViewController.people.remove(at: indexPath.row)
        // handle delete (by removing the data from your array and updating the tableview)
        tableView.deleteRows(at: [indexPath], with: .fade)
    }
  }
}

РЕДАКТИРОВАТЬ:

Вот пример массива, когда есть 3 пользователя :

 3 elements
 ▿ 0 : Person
 ▿ Name : Optional<String>
  - some : "Person's Name1"
 ▿ PostNumber : Optional<String>
  - some : "1"
 ▿ StoryNumber : Optional<String>
  - some : "1"
 ▿ Compensation : Optional<String>
  - some : "1"
 ▿ ProfileImageUrl : Optional<String>
  - some : "PROFILEIMAGE URL HERE"
 ▿ userID : Optional<String>
  - some : "B2Z4DlZ8RucvEQhz2NSUkquqc5P2"

 ▿ 1 : Person
 ▿ Name : Optional<String>
  - some : "Person's Name2"
 ▿ PostNumber : Optional<String>
  - some : "1"
 ▿ StoryNumber : Optional<String>
  - some : "11"
 ▿ Compensation : Optional<String>
  - some : "1"
 ▿ ProfileImageUrl : Optional<String>
  - some : "PROFILEIMAGE URL HERE"
 ▿ userID : Optional<String>
  - some : "Lbn9HL1WIpZTMFzpGWAXy7Ra0EA2"

 ▿ 2 : Person
 ▿ Name : Optional<String>
  - some : "Person's Name3"
 ▿ PostNumber : Optional<String>
  - some : "1"
 ▿ StoryNumber : Optional<String>
  - some : "1"
 ▿ Compensation : Optional<String>
  - some : "1"
 ▿ ProfileImageUrl : Optional<String>
  - some : "PROFILEIMAGE URL HERE"
 ▿ userID : Optional<String>
  - some : "NE6WVUfF6WQjJT9eeVSJgfvrrZW2"

Ответы [ 2 ]

2 голосов
/ 07 августа 2020

Если это ваша цель (как указано в вашем вопросе)

Я бы хотел, чтобы ноль был идентификатором пользователя

В этой строке

let considerationInfluencerRef = Database.database().reference().child("Considerations")
                           .child("\(todaysDate)")
                           .child(imageName)
                           .child("Users")
                           .child("\(numberOfPeopleCells.startIndex)")

измените конечный дочерний узел с этого

.child("\(numberOfPeopleCells.startIndex)")

на этот

.child(Auth.auth().currentUser.uid)

Чтобы немного расширить, вы должны использовать массив dataSource для поддержки вашего tableView

var myDatasource = [Person]()

поэтому, если у вас есть три человека (использующих вашу структуру)

myDatasource[0] = person 0
myDatasource[1] = person 1
myDatasource[2] = person 2

Итак, просто перебирайте массив, получите человека и его uid и запишите данные. Примерно так (не копируйте пасту, делал это на моем iPad)

myDatasource.forEach { person in
   let uid = person.userID
   let dict = [
      "name": person.name,
      "postNumber": person.postNumber
   ]

   let ref = let considerationInfluencerRef = Database.database().......child(uid)
   ref.setData(dict)
}
0 голосов
/ 07 августа 2020

Это практически невозможно сделать в Firebase.

Перейти на Firestore.

Это займет у вас крошечную долю времени.

Всегда стоит помнить, что Firebase «Абсолютно удивительна и невероятна, но часто совершенно бесполезна».

Есть много вещей, которые вы просто не можете реально сделать в Firebase. жестко и критично.

Более того, для этого просто перейдите на обычную реляционную базу данных .

Вы сделаете это за несколько минут, это так просто.

(Да, syn c сложнее, но это можно сделать. Просто используйте PubNub или что-то подобное, или даже Firebase raw «только как синхронизатор» для синхронизации c.)

...