Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/visual-studio/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 在后台线程错误时调用UI API_Ios_Swift_Core Data - Fatal编程技术网

Ios 在后台线程错误时调用UI API

Ios 在后台线程错误时调用UI API,ios,swift,core-data,Ios,Swift,Core Data,我有一个函数,用于获取存储到核心数据的上下文。我有几个视图控制器,但我得到一个错误 private class func getContext() -> NSManagedObjectContext { let appDelegate = UIApplication.shared.delegate as! AppDelegate return appDelegate.weatherPersistentContainer.viewContext } 但是,我在

我有一个函数,用于获取存储到核心数据的上下文。我有几个视图控制器,但我得到一个错误

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

但是,我在访问从后台线程调用的UI API时出错。

从错误中可以看出,您无法从后台线程调用
UIApplication.shared
。由于您不想在
DispatchQueue.main.async
中包装对我们的
getContext
方法的每次调用,因此可以根据需要更新
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
。很好的一点是,结果返回到原始线程。

您有什么问题吗?如何在不出现错误的情况下获取此结果?