2017-11-13 10 views
0

Firbase에서 데이터를 올바르게 출력하는 데 문제가 있습니다. 나는 많은 시간을 보냈고 이것을 수행하는 많은 다른 방법을 시도했다. 다른 데이터 구조 등을 만들었지 만 나는 항상 충돌이나 무관하게 결과를 얻을 것이다. 현재 코드가 작동하고 파이어베이스에서 테이블 뷰로 데이터를 출력하지만 배열이 정렬되지 않고 특정 사용자의 한 배열에있는 필드가 다른 테이블과 관련이 없으며 올바르지 않습니다.Firebase/Swift - Firebase에서 데이터를 출력하는 것이 잘못되었습니다.

내가 상상하고 있습니다. 이 작업을 수행하는 데 더 좋은 방법이므로이 기능을 사용하여 올바른 방향으로 어떤 도움이나 요점을 알려 주시면 감사하겠습니다. 또한 날 쉽게 이동하시기 바랍니다, 나는이에 알고있어 :)

이 내 중포 기지 구조입니다 : 이것은 내 렌탈 모델

입니다 :

struct RentalObjects { 

    var title: [String : AnyObject] = [:] 
    var rentalType: [String : AnyObject] = [:] 
    var dateAval: [String : AnyObject] = [:] 
    var location: [String : AnyObject] = [:] 
    var price: [String : AnyObject] = [:] 
    var bond: [String : AnyObject] = [:] 
    var pets: [String : AnyObject] = [:] 
    var descripton: [String : AnyObject] = [:] 

} 

이가 내 테이블 뷰로 출력하는 VC 코드 :

import UIKit 
import FirebaseDatabase 


class RentalTableViewVC: UIViewController, UITableViewDataSource, UITableViewDelegate{ 

    @IBOutlet weak var rentalImage: UIImageView! 
    @IBOutlet weak var tableView: UITableView! 
    @IBOutlet weak var rentalTitle: UILabel! 
    @IBOutlet weak var rentalPrice: UILabel! 


    var rentalsObject = RentalObjects() 
    var databaseRef:DatabaseReference? 
    var handle: DatabaseHandle? 

    var arrayOfTitles = [String?]() 
    var arrayOfBond = [String?]() 



    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
     return rentalsObject.title.count 
    } 

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 
     let cell = UITableViewCell(style: .subtitle, reuseIdentifier: "cell") 

     for (_, value) in rentalsObject.title { 
      arrayOfTitles.append(value as? String) 

     } 

     for (_, value) in rentalsObject.bond { 

      arrayOfBond.append(value as? String) 

     } 


     cell.textLabel?.text = ("Title: \(String(describing: arrayOfTitles[indexPath.row]!)), Bond: \(String(describing: arrayOfBond[indexPath.row]!))") 



     return cell 
    } 


    @IBAction func backPressed(_ sender: Any) { 
     dismiss(animated: true, completion: nil) 
    } 

    override func viewDidLoad() { 
    super.viewDidLoad() 


     databaseRef = Database.database().reference().child("Rentals") 
     databaseRef?.observe(DataEventType.value, with: { (snapshot) in 

      for rentals in snapshot.children.allObjects as! [DataSnapshot] { 





     switch rentals.key { 

       case "title" : 
        let titleObj = rentals.value as! [String : AnyObject] 

        self.rentalsObject.title = titleObj 

       case "rentalType": 
        let rentalTypeObj = rentals.value as! [String : AnyObject] 
        self.rentalsObject.rentalType = rentalTypeObj 

       case "dateAval": 
        let dateAvalObj = rentals.value as! [String : AnyObject] 
        self.rentalsObject.dateAval = dateAvalObj 
       case "location": 
        let locationObj = rentals.value as! [String : AnyObject] 
        self.rentalsObject.location = locationObj 

       case "price" : 
        let priceObj = rentals.value as! [String : AnyObject] 
        self.rentalsObject.price = priceObj 

       case "bond" : 
        let bondObj = rentals.value as! [String: AnyObject] 
        self.rentalsObject.bond = bondObj 

       case "pets" : 
        let petsObj = rentals.value as! [String: AnyObject] 
        self.rentalsObject.pets = petsObj 

       case "description": 
        let desObj = rentals.value as! [String: AnyObject] 
        self.rentalsObject.descripton = desObj 

       default: 
        break 

       } 

      } 
      self.tableView.reloadData() 
     }) 

    } 

} 

답변

0

.childAdded 사용 .value 대신. ChildAdded는 각 개체를 가져오고 Value는 모든 개체를 가져옵니다. 'cellForRowAr'메소드에서 for-loops를 제거해야합니다.

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 
     let cell = UITableViewCell(style: .subtitle, reuseIdentifier: "cell") 

     cell.textLabel?.text = ("Title: \(String(describing: arrayOfTitles[indexPath.row]!)), Bond: \(String(describing: arrayOfBond[indexPath.row]!))") 

     return cell 
} 



override func viewDidLoad() { 
    super.viewDidLoad() 

    databaseRef = Database.database().reference().child("Rentals") 
    databaseRef?.observe(.childAdded, with: { (snapshot) in 

     if let dictionary = snapshot.value as? [String: AnyObject] { 

      switch snapshot.key { 

      case "title" : 
      _ = dictionary.map{self.arrayOfTitles.append($0.value as? String)} 
      case "rentalType": 

      case "dateAval": 

      case "location": 

      case "price" : 

      case "bond" : 
      _ = dictionary.map{self.arrayOfBond.append($0.value as? String)} 
      case "pets" : 

      case "description": 

      default: 
       break 
      } 
     } 
    }) 
    self.tableView.reloadData() 
} 
+0

안녕하세요 a.afanasiev 님, ive 님이이 작업을 지금 진행하고 있지만 이전 문제와 동일한 문제가 발생했습니다. 배열의 결과물이 이상하게 생겨서 서로 어긋나게됩니다. 아래의 코드를 쉽게 읽을 수 있도록 다른 질문에 게시했습니다. –

+0

안녕하세요 a.afanasiev 님, ive님께 서이 작업을 지금 할 수있게되었지만 이전 코드와 동일한 문제가 발생했습니다. 배열의 결과물이 이상하게 생겨서 서로 어긋나게됩니다. ViewDidLoad 함수 내에서 배열을 인쇄하면 올바른 것처럼 보입니다. 그러나 레이블을 출력하거나 cellForRowAt 함수 내에서 인쇄하면 배열이 복제 된 것처럼 보입니다. 그게 왜 일어날까요? –

+0

'numberOfRowsInSection'메소드에서 무엇을 반환합니까? rentalsObject.title.count 또는 arrayOfTitles.count? –

관련 문제