英文:
Refreshing tableview with UIRefreshControl
问题
我正在使用一个刷新控件,但是虽然我的代码编译通过,但当前的代码存在一个问题,它首先删除所有数据,然后再拉取表格数据,导致出现短暂的没有显示任何数据的情况。有没有快速修复的方法?我是否应该在加载完帖子后调用 removeAll 来使用完成处理程序来解决这个问题...
编辑:我已经添加了下面的 fetchNetworkPost 的相关部分。
override func viewDidLoad() {
super.viewDidLoad()
let refreshControl = UIRefreshControl()
refreshControl.addTarget(self, action: #selector(requestData), for: .valueChanged)
self.refreshControl = refreshControl
requestData()
}
@objc
func requestData() {
self.postArray.removeAll()
fetchNetworkPosts() //填充数据
refresh()
}
func refresh() {
self.refreshControl?.endRefreshing()
self.tableView.reloadData()
}
func fetchNetworkPosts() {
for personId in networkArray {
let currentUserRef = Database.database().reference().child("posts").queryOrdered(byChild: "userId").queryEqual(toValue: personId)
currentUserRef.observeSingleEvent(of: .value, with: { (snapshot) in
for childSnapshot in snapshot.children {
let test = Post(snapshot: childSnapshot as! DataSnapshot)
self.postArray.append(test)
}
self.postArray.sort { $0.postDate > $1.postDate } //排序
self.tableView.reloadData()
})
}
}
希望这可以帮助你解决问题。
英文:
I'm using a refreshcontrol, but while my code compiles, the current code has an issue where it removes all the data first and then pulls in the table data causing a brief moment where it isn't showing any data. Is there a quick fix for this? Should I use a completion handler for this by calling removeAll once the posts are loaded...
Edit: I've added the relevant portion of fetchNetworkPost below.
override func viewDidLoad() {
super.viewDidLoad()
let refreshControl = UIRefreshControl()
refreshControl.addTarget(self, action: #selector(requestData), for: .valueChanged)
self.refreshControl = refreshControl
requestData()
}
@objc
func requestData() {
self.postArray.removeAll()
fetchNetworkPosts() //populates data
refresh()
}
func refresh() {
self.refreshControl?.endRefreshing()
self.tableView.reloadData()
}
func fetchNetworkPosts() {
for personId in networkArray {
let currentUserRef =
Database.database().reference().child("posts").queryOrdered(byChild:
"userId").queryEqual(toValue: personId)
currentUserRef.observeSingleEvent(of: .value, with: {
(snapshot) in
for childSnapshot in snapshot.children {
let test = Post(snapshot: childSnapshot as! DataSnapshot)
self.postArray.append(test)
}
self.postArray.sort { $0.postDate > $1.postDate } //sort
self.tableView.reloadData()
})
}
}
答案1
得分: 1
在fetchNetworkPosts()方法中,当你接收到新数据时,执行以下操作:
self.postArray.removeAll() // 移除旧数据
for childSnapshot in snapshot.children {
let test = Post(snapshot: childSnapshot as! DataSnapshot)
self.postArray.append(test)
}
self.postArray.sort { $0.postDate > $1.postDate } // 排序
self.refresh() // 调用refresh()
希望这对你有帮助。
英文:
override func viewDidLoad() {
super.viewDidLoad()
let refreshControl = UIRefreshControl()
refreshControl.addTarget(self, action: #selector(requestData), for: .valueChanged)
self.refreshControl = refreshControl
requestData()
}
@objc func requestData() {
fetchNetworkPosts() //populates data
}
func refresh() {
self.refreshControl?.endRefreshing()
self.tableView.reloadData()
}
func fetchNetworkPosts() {
for personId in networkArray {
let currentUserRef =
Database.database().reference().child("posts").queryOrdered(byChild:
"userId").queryEqual(toValue: personId)
currentUserRef.observeSingleEvent(of: .value, with: {
(snapshot) in
self.postArray.removeAll()
for childSnapshot in snapshot.children {
let test = Post(snapshot: childSnapshot as! DataSnapshot)
self.postArray.append(test)
}
self.postArray.sort { $0.postDate > $1.postDate } //sort
self.refresh()
})
}
}
inside fetchNetworkPosts() method when you receive the new data
self.postArray.removeAll() remove old data there and then assign new value at that time. then call refresh().
Hope this will work for you.
答案2
得分: 1
在fetchNetworkPosts()完成后,请调用refresh()方法,如下所示。请查看以下代码。
@objc func requestData() {
fetchNetworkPosts() // 填充数据
}
func refresh() {
self.refreshControl?.endRefreshing()
self.tableView.reloadData()
}
func fetchNetworkPosts() {
self.postArray.removeAll() // 在这里移除数组数据
for personId in networkArray {
let currentUserRef =
Database.database().reference().child("posts").queryOrdered(byChild:
"userId").queryEqual(toValue: personId)
currentUserRef.observeSingleEvent(of: .value, with: {
(snapshot) in
for childSnapshot in snapshot.children {
let test = Post(snapshot: childSnapshot as! DataSnapshot)
self.postArray.append(test)
}
self.postArray.sort { $0.postDate > $1.postDate } // 排序
self.refresh()
})
}
}
英文:
Call your refresh() after the completion of fetchNetworkPosts() like below. Check the code below.
@objc func requestData() {
fetchNetworkPosts() //populates data
}
func refresh() {
self.refreshControl?.endRefreshing()
self.tableView.reloadData()
}
func fetchNetworkPosts() {
self.postArray.removeAll() // remove your array data here
for personId in networkArray {
let currentUserRef =
Database.database().reference().child("posts").queryOrdered(byChild:
"userId").queryEqual(toValue: personId)
currentUserRef.observeSingleEvent(of: .value, with: {
(snapshot) in
for childSnapshot in snapshot.children {
let test = Post(snapshot: childSnapshot as! DataSnapshot)
self.postArray.append(test)
}
self.postArray.sort { $0.postDate > $1.postDate } //sort
self.refresh()
})
}
}
答案3
得分: 0
也许改变顺序可以解决你的问题。
override func viewDidLoad() {
super.viewDidLoad()
let refreshControl = UIRefreshControl()
refreshControl.addTarget(self, action: #selector(requestData), for: .valueChanged)
self.refreshControl = refreshControl
requestData()
}
@objc
func requestData() {
fetchNetworkPosts() //populates data
refresh()
}
func refresh() {
self.postArray.removeAll()
self.refreshControl?.endRefreshing()
self.tableView.reloadData()
}
你在获取数据之前移除了数据。所以,先获取数据,然后再清空你的 tableView。你会在短暂的时间内看到旧数据,而不是空的 tableView。
英文:
maybe changing order will fix your problem.
override func viewDidLoad() {
super.viewDidLoad()
let refreshControl = UIRefreshControl()
refreshControl.addTarget(self, action: #selector(requestData), for: .valueChanged)
self.refreshControl = refreshControl
requestData()
}
@objc
func requestData() {
fetchNetworkPosts() //populates data
refresh()
}
func refresh() {
self.postArray.removeAll()
self.refreshControl?.endRefreshing()
self.tableView.reloadData()
}
You are removing your data before fetch it. So, fetch data first then remove your tableView. You'll see your old data for brief time, not empty tableView.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。


评论