大家好,我目前正在开发一个程序,该程序在 UITableView 中保存书籍列表。如您所知,TableView 采用两种方法,一种是 cellForRowAtIndexPath,另一种是我今天要讨论的 numberOfRowsInSection。所以我遇到的问题是我访问数据库以获取数据库中当前的书籍数量,以便返回书籍结构数组中需要的索引数量。所以我有两个组,即购买组和销售组,其中可能有也可能没有任何书籍。
无论如何,我填充数组(一开始它是空的),然后将 books.count 作为 numberOfRowsInSection 返回。问题是我始终返回 0,因为执行 return 后数组被填充。
下面是我的代码。
func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
populateArray()
print("books.count: ",books.count)
return books.count // KEEPS RETURNING 0 BC IT HASN'T POPULATED YET *ARRRRRRGH*
}
func populateArray(){
print("started looking")
var indices = 0
if divider.selectedSegmentIndex == 0{
ref.child(school).observeEventType(.Value, withBlock: { (snapshot) in
let numSelling = snapshot.value!["numSelling"] as! Int // gets numSelling
if numSelling > 0 {
self.noEntries = false
print("numSelling: ", numSelling) //see console
indices = numSelling
}else{
self.noEntries = true
indices = 1
print("No Values Selling")
}
}) { (error) in
print(error.localizedDescription)
}
}else{
ref.child(school).observeEventType(.Value, withBlock: { (snapshot) in
let numBuying = snapshot.value!["numBuying"] as! Int // gets numBuying
if numBuying > 0 {
self.noEntries = false
print("numBuying: ", numBuying) //see console
indices = numBuying
}else{
self.noEntries = true
indices = 1
}
}) { (error) in
print(error.localizedDescription)
}
}
delay(0.5){
print("ind: ", indices) // printing correctly
if(self.noEntries){ // just add one book to get the indices to be 1
self.books.append(Book(isbn: "", title: "", author: "", edition: "", price: "", uid: ""))
return
}
if self.divider.selectedSegmentIndex == 0{
self.ref.child(self.school).child("selling").observeEventType(.Value, withBlock: { (snapshot) in
let booksJSON = snapshot.value! as! NSArray
for bookJSON in booksJSON { // add the book to the array
let tempAuthor = bookJSON["authors"] as! String
let tempTitle = bookJSON["title"] as! String
let tempEdition = bookJSON["edition"] as! String
let tempPrice = bookJSON["price"] as! String
let tempISBN = bookJSON["isbn"] as! String
let tempUID = bookJSON["uid"] as! String
self.books.append(Book(isbn: tempISBN, title: tempTitle, author: tempAuthor, edition: tempEdition, price: tempPrice, uid: tempUID))
}
}) { (error) in
print(error.localizedDescription)
}
}else if self.divider.selectedSegmentIndex == 1{
self.ref.child(self.school).child("buying").observeEventType(.Value, withBlock: { (snapshot) in
let booksJSON = snapshot.value! as! NSArray
for bookJSON in booksJSON { // add the book to the array
let tempAuthor = bookJSON["authors"] as! String
let tempTitle = bookJSON["title"] as! String
let tempEdition = bookJSON["edition"] as! String
let tempPrice = bookJSON["price"] as! String
let tempISBN = bookJSON["isbn"] as! String
let tempUID = bookJSON["uid"] as! String
self.books.append(Book(isbn: tempISBN, title: tempTitle, author: tempAuthor, edition: tempEdition, price: tempPrice, uid: tempUID))
}
}) { (error) in
print(error.localizedDescription)
}
}
}
}
func delay(delay:Double, closure:()->()) {
dispatch_after(
dispatch_time(
DISPATCH_TIME_NOW,
Int64(delay * Double(NSEC_PER_SEC))
),
dispatch_get_main_queue(), closure)
}
请记住,我无法在此方法中进行回调,因为加载 View 时程序会自动调用它。
此外,延迟部分正在努力阻止同样的事情发生。问题是我不能将延迟放在返回周围,因为它认为我想为延迟 block 返回一个 Int。
控制台:
started looking
books.count: 0
started looking
books.count: 0
started looking
books.count: 0
started looking
books.count: 0
numSelling: 6
numSelling: 6
numSelling: 6
numSelling: 6
ind: 6
ind: 6
ind: 6
ind: 6
正如您所看到的,它甚至在从数据库获取 numSelling 值之前就返回了 0。
非常感谢您的帮助,祝您有美好的一天!
最佳答案
一旦方法被调用,您就不能延迟返回该方法,但您可以要求 TableView 再次调用数据源方法。
最简单的解决方案是在填充数据后(即在 populateArray()
方法末尾)在 TableView 上调用 reloadData()
。我可能还会将调用移到其他地方(如果合适的话,可能是 viewDidLoad()
)。
关于ios - 如何在 Swift 中延迟回电,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39318806/