首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >获取Firebase数据快照并存储数据

获取Firebase数据快照并存储数据
EN

Stack Overflow用户
提问于 2017-02-11 04:40:08
回答 1查看 242关注 0票数 1

我有以下JSON Firebase数据库:

代码语言:javascript
复制
{ "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": []
        } 
    }
}

以下是水果类:

代码语言:javascript
复制
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代码:

代码语言:javascript
复制
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中有一个数组和链接,而另一个没有。

我已经看到有其他的方法来拍摄快照,但是我要在整个应用程序中使用水果数据,这样我就可以更容易地拥有果树对象,但是如果有人建议一种可以工作的快照的另一种方式,我不会在中间选择。任何帮助都是非常感谢的!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-02-11 06:51:44

首先,使用此代码更改viewDidLoad,因为根本不需要addedFruites

代码语言:javascript
复制
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()
        }

    })
}

检查是否正确设置了读写的基本规则。我认为这是一个问题,因为可能是你没有制定规则。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42172311

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档