为什么我的串行调度不起作用?

Why is my serial dispatch not working?

我想加载一些已经存储在 Core Data 中的天气数据。 显然我希望集合视图在加载数据后自行更新。谁能告诉我,为什么这段代码不起作用?

let context = PersistanceService.context
let fetchRequest: NSFetchRequest<Weather> = Weather.fetchRequest()
let queue = DispatchQueue(label: "loadanddisplay")
queue.sync {
    do {
        let result = try context.fetch(fetchRequest)
        self.weatherArray = result
        self.collectionView?.reloadData()

    } catch let err { print(err) }
}  

当我在这个函数执行后手动重新加载数据时,它出现了。

下面的代码块在后台线程上执行

queue.sync {}

并且集合视图是主线程的一部分,或者 UI 必须是 handled/updated 来自 main 线程只有.

您可以尝试如下方式重新加载集合视图:

DispatchQueue.main.async { // async OR sync as you want
        self.collectionView?.reloadData()
    }

这对我有用:

DispatchQueue.global(qos: .background).async {
    let context = PersistanceService.context
    let fetchRequest: NSFetchRequest<Weather> = Weather.fetchRequest()
    do {
        let result = try context.fetch(fetchRequest)
        self.weatherArray = result
    } catch let err { print(err) }

    DispatchQueue.main.async {
        self.pageControl.numberOfPages = self.weatherArray.count
        self.collectionView?.reloadData()
    }
}

只要确保你正确地调用了它。我必须准备好了解 GCD 的工作原理才能得到它。