UI API调用后台线程错误

时间:2018-04-04 16:39:12

标签: ios swift core-data

我有一个函数可以获取存储到Core Data的上下文。我有一些视图控制器,但是我收到了一个错误。

private class func getContext() -> NSManagedObjectContext {
    let appDelegate = UIApplication.shared.delegate as! AppDelegate       
    return appDelegate.weatherPersistentContainer.viewContext
}

但是我收到有关从后台线程调用UI API的错误。

1 个答案:

答案 0 :(得分:2)

从错误中可以看出,您无法从后台线程调用UIApplication.shared。由于您不希望在getContext中包含对DispatchQueue.main.async方法的每次调用,因此您可以根据需要更新getContext方法以执行必要的包装:

private class func getContext() -> NSManagedObjectContext {
    let appDelegate: AppDelegate
    if Thread.current.isMainThread {
        appDelegate = UIApplication.shared.delegate as! AppDelegate
    } else {
        appDelegate = DispatchQueue.main.sync {
            return UIApplication.shared.delegate as! AppDelegate
        }
    }
    return appDelegate.weatherPersistentContainer.viewContext
}

此代码确保仅在主队列上调用UIApplication.shared,即使从后台线程调用getContext也是如此。好的部分是结果在原始线程上返回。