从Firebase删除后,Swift 3 UITableView无法更新

时间:2017-06-03 09:48:22

标签: ios uitableview firebase swift3

当用户在UITableView上滑动删除时,我试图从Firebase数据库中删除项目。

我还使用了来自https://github.com/erangaeb/dev-notes/blob/master/swift/ViewControllerUtils.swift的漂亮的showActivityIndi​​cator和hideActivityIndi​​cator函数,以便轻松显示和隐藏活动指示器。

运行以下代码时,我可以看到数据库记录以及从Firebase中正确删除的JPG文件。

但问题是活动指示器永远不会从屏幕上消失,UITableView也不会刷新。

实际上,

import java.net.MalformedURLException;

print("Stopping activity indicator")

甚至没有跑。

我做错了什么?

print("Reloading table view")

3 个答案:

答案 0 :(得分:1)

仍然不确定为什么Firebase removeValue和删除功能下面的代码没有运行,但我设法找到了解决方法。

事实证明,只有当我删除表格中的最后一条剩余记录时,代码才会起作用,之后整个Firebase节点都会被删除。

所以,当发生这种情况时,我已经添加了一个观察者来强制重新加载表。

在viewDidLoad()下,我添加了以下行:

override func viewDidLoad() {
    super.viewDidLoad()

    // ... other preceding lines of code

    // Forcefully trigger a TableView refresh in case the Firebase node is empty
    refItems.observe(.value, with: { snapshot in
        if snapshot.exists() {
            print("Found the Firebase node")
        } else {
            print("Firebase node doesn't exist")
            self.tableView.reloadData()
        }
    })

    // ...other following lines of code
}

答案 1 :(得分:1)

在保持tableView和Firebase同步时,有两个主要选项:

  

1)从Firebase中删除节点时,请手动将其从中删除   从Firebase中删除时的tableView数据源。不需要观察者。

     

2)将删除事件观察者附加到Firebase,以便在删除节点时   您的应用程序将收到一个属于哪个节点的事件,并将其删除。

这是一个例子;为了简洁起见,我将tableView代码保留下来。

假设我们有一个显示用户的tableView。 tableView有一个usersArray的dataSource,它包含UserClass对象。

给定Firebase结构

users
  user_0
    name: "Frank"
  user_2
    name: "Bill"
  user_3
    name: "Hugh"

我们向用户节点添加了三个观察者,childAdded,childChanged,childRemoved

class UserClass {
    var key = ""
}

var usersArray = [UserClass]()

let usersRef = self.ref.child("users")

usersRef.observe(.childAdded, with: { snapshot in
    let user = UserClass()
    user.key = snapshot.key
    self.usersArray.append(user)
    self.tableView.reloadData()
})

usersRef.observe(.childChanged, with: { snapshot in
    if let index = self.usersArray.index(where: {$0.key == snapshot.key}) {
        //update it in the array via the index
        self.tableView.reloadData()
    } else {
        //item not found
    }
})

usersRef.observe(.childRemoved, with: { snapshot in
    if let index = self.usersArray.index(where: {$0.key == snapshot.key}) {
        self.usersArray.remove(at: index) //remove it from the array via the index
        self.tableView.reloadUI()
    } else {
        item not found
    }
})

如果添加了用户,.childAdded观察者会收到新用户,因此可以将其附加到数组中。

如果更改了用户,则.childChanged观察者会收到更改后的用户。抓住密钥(通常是uid),在数组中找到它并更新属性。

如果删除了用户,则.childRemoved观察者会收到已删除的用户。拿起钥匙,在阵列中找到它并将其移除。

在每种情况下,在更改为dataSource后重新加载tableView。

答案 2 :(得分:0)

你需要在块中编写代码,如下所示:

 imageRef.delete { error in
                    if let error = error {
                        print("Problem deleting photo")
                    } else {
                        print("Photo deleted successfully")
                      ViewControllerUtils().hideActivityIndicator(uiView: self.view)

                     print("Reloading table view")
                      // Reloading table view
                        self.tableView.reloadData()
                    }
                }