2017-02-11 143 views
1

我有以下的JSON火力地堡數據庫:以火力地堡數據的快照和存儲數據

{ "fruits": { 
     "apple": { 
      "name": "Gala", 
      "url": "//s-media-cache-ak0.pinimg.com/564x/3e/b1/e7/3eb1e756d66856975d6e43ebb879200a.jpg", 
      "fruitArray": [1, 2] 
     }, 
     "orange": { 
      "name": "Tangerine", 
      "url": "//userscontent2.emaze.com/images/0ba588c8-42d9-45e9-a843-d19e5720515a/e430f9a827f139e9f99f2826175dd0a9.jpg", 
      "fruitArray": [] 
     } 
    } 
} 

以下水果類:

class Fruit { 
    var name: String 
    var url: String 
    var fruitArray: [Int] 
    var ref: FIRDatabaseReference? 

    init(name: String, url: String, fruitArray: [Int]) { 
     self.name = name 
     self.url = url 
     self.fruitArray = fruitArray 
     self.ref = nil 
    } 

    init(snapshot: FIRDataSnapshot) { 
     let snapshotValue = snapshot.value as! [String: Any] 
     name = snapshotValue["name"] as! String 
     url = snapshotValue["url"] as! String 
     if snapshotValue["fruitArray"] == nil { 
      fruitArray = [0] 
     } else { 
      fruitArray = snapshotValue["fruitArray"] as! [Int] 
     } 
     ref = snapshot.ref 
    } 

    func toAnyObject() -> Any { 
     return [ 
      "name": name, 
      "url": url, 
      "fruitArray": fruitArray 
     ] 
    } 

而下面FruitTableViewController代碼:

class FruitTableViewController: UITableViewController { 

    // MARK: Properties 
    var fruits: [Fruit] = [] 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     let ref = FIRDatabase.database().reference(withPath: "fruits") 

     ref.queryOrdered(byChild: "name").observe(.value, with: { snapshot in 
      var addedFruits: [Fruit] = [] 

      for fruit in snapshot.children { 
       let newFruit = Fruit(snapshot: fruit as! FIRDataSnapshot) 
       addedFruit.append(newFruit) 
      } 

      self.fruits = addedFruits 

      self.tableView.reloadData() 
     }) 
    } 

    override func didReceiveMemoryWarning() { 
     super.didReceiveMemoryWarning() 
    } 

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

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


    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 
     let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) as? FruitTableViewCell 

     let fruit = fruits[indexPath.row] 
     let imgURL = NSURL(string: fruit.url) 

     if imgURL != nil { 
      let data = NSData(contentsOf: (imgURL as? URL)!) 
      cell.icon.image = UIImage(data: data as! Data) 
     } 

     cell.nameLabel.text = fruit.name 

     return cell 
    } 

出於某種原因,火力地堡快照不工作。我幾乎沒有嘗試過所有的東西。

這不是一個TableViewCell問題(我認爲),因爲我查了FruitViewCell和故事板,一切都井然有序。我的直覺是,它與我將URL更改爲字符串以及數組的方式有關。我用這個確切的代碼爲不同的iOS項目和它的工作,但兩個項目之間的區別是,這其中有JSON內的排列和連接,而另一人則沒有。

我已經看到了還有其他的方式來拍攝快照,但我要在整個應用程序中使用的水果數據,從而更容易,讓我有一種水果的對象,但我不會年年中,如果有人他們建議採取另一種拍攝快照的方法。任何幫助表示讚賞!

+0

首先你的fruitArray不是字符串..它是一個數組 –

+0

@ EICaptainv2.0我知道,但我找不到一種方法來初始化Fruit對象中的快照,方法是將數組和url保持爲是。 – ch1maera

+0

像https://paste.ofcode.org/MyhqPYaLuGtcWUj6w99ncF –

回答

1

首先改變你的viewDidLoad這個代碼addedFruites是沒有必要的讀寫所有

override func viewDidLoad() { 
    super.viewDidLoad() 

    let ref = FIRDatabase.database().reference().child("fruits") 

    ref.observe(.value, with: { snapshot in 
     if snapshot.exists() { 
      for fruit in snapshot.children { 
      let newFruit = Fruit(snapshot: fruit as! FIRDataSnapshot) 
      self.fruits.append(newFruit) 
     } 
     self.tableView.reloadData() 
     } 

    }) 
} 

檢查火力規則設置正確或不..我覺得這裏是一個問題,因爲可能你沒有設定這個規則。