【发布时间】:2016-09-05 06:00:40
【问题描述】:
大家好,我目前正在开发一个在 UITableView 中保存书籍列表的程序。如你所知,TableView 有两种方法,一种是 cellForRowAtIndexPath,另一种是我今天要讲的 numberOfRowsInSection。所以我遇到的问题是我访问我的数据库以获取当前在数据库中的书籍数量,以便返回我在 Book stucts 数组中需要多少索引。所以我有两组,买入和卖出,其中可能有也可能没有任何书籍。
无论如何,我填充了我的数组(一开始是空的),然后我将 books.count 作为 numberOfRowsInSection 返回。问题是我一直返回 0,因为在返回执行后数组被填充。
下面是我的代码。
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)
}
请记住,我无法在此方法中进行回调,因为它会在加载视图时由程序自动调用。
此外,延迟段正在努力阻止同样的事情发生。问题是我不能将延迟放在返回周围,因为它认为我想为延迟块返回一个 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。
非常感谢您的帮助,祝您有美好的一天!
【问题讨论】:
-
您可以(并且必须)进行回调。尝试理解异步模式。在重新加载表视图之前不会调用数据源方法。 GCD 中有一些方法可以将任务分组在一起,并在分组任务完成时调用完成块。
标签: ios swift firebase firebase-realtime-database