【问题标题】:Why is my serial dispatch not working?为什么我的串行调度不起作用?
【发布时间】:2018-08-23 15:17:15
【问题描述】:

我想加载一些已经存储在 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) }
}  

当我在这个函数执行后手动重新加载数据时,它会显示出来。

【问题讨论】:

    标签: swift core-data synchronization grand-central-dispatch dispatch


    【解决方案1】:

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

    queue.sync {}
    

    集合视图是主线程的一部分,或者 UI 必须仅从 线程处理/更新。

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

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

    【讨论】:

    • 显然我已经尝试过了。根本没有改变任何东西。
    • 你能否详细说明这一行,我不明白你到底在做什么:当我在这个函数执行后手动重新加载数据时,它会显示出来。??
    • 这意味着当我为此目的创建一个按钮时 reloadData() 工作。但是对于可以自动完成的事情(或者在我的情况下不是),必须单击按钮并不是最好的用户体验
    • 您是否检查过您的代码是否在不使用 DispatchQueue 的情况下工作?
    • 你能把你在按钮点击上写的代码贴出来吗?我在学习核心 java 时实现了相同的功能,我也交叉检查了你的代码,我没有发现你的代码有任何问题。
    【解决方案2】:

    这里为我完成了这项工作:

    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 的工作原理才能获得它。

    【讨论】:

      猜你喜欢
      • 2020-12-15
      • 2013-10-02
      • 2019-06-04
      • 1970-01-01
      • 1970-01-01
      • 2015-08-14
      • 1970-01-01
      • 2016-10-03
      相关资源
      最近更新 更多