繁体   English   中英

Swift Firebase:带有.childAdded的UIRefreshControl

[英]Swift Firebase: UIRefreshControl with .childAdded

好吧,请原谅我,如果这可能是一个非常基本的问题,但是我该如何在仅将新项目添加到Firebase的情况下刷新tableView?

我正在尝试为tableView实现“拉动刷新”,并使用已添加到Firebase的新项目填充tableView。 在viewDidLoad上,我调用.observeSingleEvent(.value)来显示表。

在刷新函数中,我调用.observe(.childAdded)。 但是,这样做会使应用程序始终监听添加的内容,从而使我的应用程序始终都能reloadingData。 如何编码,使其仅在执行“拉动刷新”时才刷新? 到目前为止,我的代码:

lazy var refresh: UIRefreshControl = {
        let refresh = UIRefreshControl(frame: CGRect(x: 50, y: 100, width: 20, height: 20))
        refresh.addTarget(self, action: #selector(refreshData), for: .valueChanged)
        return refresh
    }()

var eventsArray: [FIRDataSnapshot]! = []

    override func viewDidLoad() {
        super.viewDidLoad()
        ref = FIRDatabase.database().reference()

        ref.child("events").observeSingleEvent(of: .value, with: { (snapshot) in
            for snap in snapshot.children {
                self.eventsArray.insert(snap as! FIRDataSnapshot, at: 0)
            }
            DispatchQueue.main.async {
                self.tableView.reloadData()
            }

        }) { (error) in
            print(error.localizedDescription)

        }
    }

    func refreshData() {
        self.eventsArray = []

        ref.child("events").observe(.childAdded, with: { (snapshot) in
            print(snapshot)
            self.eventsArray.insert(snapshot, at: 0)
            DispatchQueue.main.async {
                self.refresh.endRefreshing()
                self.tableView.reloadData()
            }
        }) { (error) in
            print(error.localizedDescription)

        }
    }

我也尝试了observerSingleEvent(.childAdded),但它仅从Firebase中拉出一个条目(最上面的条目)。

首先我不确定我的方法是否正确。 这里有任何建议,谢谢。

var lastKey: String? = nil

在循环遍历子级的循环中,将lastKey设置为当前快照的键。

lastKey = snap.key

让我知道这是否适合您。

func refreshData() {
    // Make sure you write a check to make sure lastKey isn't nil
    ref.child("events").orderByKey().startAt(lastKey).observeSingleEvent(of: .value, with: { (snapshot) in
        // You'll have to get rid of the first childsince it'll be a duplicate, I'm sure you can figure that out.
        for snap in snapshot.children {
            self.eventsArray.insert(snap as! FIRDataSnapshot, at: 0)
        }
        DispatchQueue.main.async {
            self.refresh.endRefreshing()
            self.tableView.reloadData()
        }
    }) { (error) in
        print(error.localizedDescription)

    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM