闭包的执行顺序

时间:2018-04-20 15:33:45

标签: ios swift closures

这是我的代码:

我只是使用这种语言编程的初学者,我遇到了动态集合视图的问题

我的问题是第一次打印是在第二次打印之后执行的,我想知道为什么......

class ViewController: UICollectionViewController, UICollectionViewDelegateFlowLayout {

@IBOutlet weak var menuButton: UIBarButtonItem!
let db = Firestore.firestore()

let cellId: String = "cellId"

var news = [[String: Any]]()


override func viewDidLoad(){
    super.viewDidLoad()


    navigationItem.title = "Novità"

    sideMenu()
    customizeNavBar()

    collectionView?.register(NovitaCellView.self, forCellWithReuseIdentifier: cellId)

}



override func didReceiveMemoryWarning(){

    super.didReceiveMemoryWarning()

}



override func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {

    db.collection("News").getDocuments(){(querySnapshot, err) in

        if let err = err{
            print("Errore: \(err)")
        }else{
            for document in (querySnapshot?.documents)!{
                let cell = document.data()
                self.news.append(cell)
                print ("document number: \(self.news.count)")
            }
        }

    }

    print("exe return with value: \(self.news.count)")
    return self.news.count
}

编辑:我尝试将其设置为viewDidLoad func,并将其设置为同步队列和异步队列,但它不起作用。

编辑2:我通过将闭包添加到最大优先级队列并在主线程中重新加载视图来完成此工作但是为了工作需要很长时间..

2 个答案:

答案 0 :(得分:1)

这个想法是这一行

db.collection("News").getDocuments(){(querySnapshot, err) in

是异步的(在主队列以外的另一个队列中运行)是一个网络请求,它将在下面一行(在主队列中运行)之后运行

答案 1 :(得分:-1)

当您调用优先级低于background thread的{​​{1}}时,您将转为getDocuments模式。因此,将以下部分代码替换为Main thread或调用的方法来自viewDidLoad

viewDidLoad

当您获得数据时,您将返回主线程并使用此代码重新加载db.collection("News").getDocuments(){(querySnapshot, err) in if let err = err{ print("Errore: \(err)") }else{ for document in (querySnapshot?.documents)!{ let cell = document.data() self.news.append(cell) print ("document number: \(self.news.count)") } DispatchQueue.main.async { tableview.reloadData() } } }

tableview

您还可以从apple文档和this教程中了解有关线程的更多信息。