ios - 如何在 Swift 中延迟回电

标签 ios swift firebase firebase-realtime-database

大家好,我目前正在开发一个程序,该程序在 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/

相关文章:

iOS 崩溃 : Terminating app due to uncaught exception reason: UIPopoverPresentationController should have a non-nil sourceView

ios - 3D 建模和统一。哪个更适合 Unity iOS tries 或 quad,为什么?

ios - 弹出 View Controller 时更改导航栏颜色

ios - 如何将图像和标签添加到 UINavigationBar 作为标题?

swift - swift guard在使用=运算符时如何判断真假

swift - 在 swift 中,utf16 代理对如何以位表示

android - 检查文档是否包含2个字符串

javascript - 如何在 php 中获取 firebase UserID?

ios - 查询 Firebase 中的现有节点返回 null

ios - 我可以构建自己的网络框架(依赖于 AFNetworking)作为 watchOS2 框架吗?