Ios 拍摄Firebase数据的快照并存储数据
我有以下JSON Firebase数据库:Ios 拍摄Firebase数据的快照并存储数据,ios,json,parsing,firebase,firebase-realtime-database,Ios,Json,Parsing,Firebase,Firebase Realtime Database,我有以下JSON Firebase数据库: { "fruits": { "apple": { "name": "Gala", "url": "//s-media-cache-ak0.pinimg.com/564x/3e/b1/e7/3eb1e756d66856975d6e43ebb879200a.jpg", "fruitArray": [1, 2] }, "orange": {
{ "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
]
}
以及下面的TableViewController代码:
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
}
由于某些原因,Firebase快照无法工作。我几乎什么都试过了,运气都不好
这不是TableViewCell的问题(我想),因为我检查了FruitViewCell和故事板,一切正常。我的直觉是,这与我将URL更改为字符串以及数组的方式有关。我在一个不同的iOS项目中使用了这段代码,它起到了作用,但这两个项目之间的区别在于,这一个项目在JSON中有一个数组和链接,而另一个项目没有
我知道还有其他方法可以拍摄快照,但我将在整个应用程序中使用水果数据,因此我更容易拥有水果对象,但如果有人建议另一种拍摄快照的方法,我不会这么做。感谢您的帮助 首先,使用此代码更改您的
viewDidLoad
,因为根本不需要添加水果
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()
}
})
}
检查firebase的读写规则是否正确设置。。我认为这是一个问题,因为可能是你没有制定规则
首先,你的数组不是字符串。。它是一个array@EICaptainv2.0我知道,但我想不出一种方法来通过保持数组和url不变来初始化Fruit对象中的快照。类似于@EICaptainv2.0,我在Fruit类中实现了您建议的内容,没有出现错误,但快照仍然无法工作。@EICaptainv2.0控制台中没有输出。