也许这个问题需要一些背景信息。
我正在使用Core Data工作在我的持久层,并发现Core Data不是线程安全的,因此需要将NSManagedObjectContext限制在每个线程中。
因此,我的方法是创建自定义后台线程NSManagedObjectContext来执行获取、保存等操作,同时创建主线程NSManagedObjectContext来从获取的NSManagedObjectId中获取NSManagedObject并将其传递给调用者方法。
默认情况下,Xcode为所有NSManagedObjectContext、NSManagedObjectModel等生成与Core Data相关的模板代码,使用lazy var。
所以我的问题是是否要使用lazy var实例化方法来创建NSManagedObjectContext,前提是lazy var会为每个试图访问它的线程初始化一个对象(不是线程安全的?)
或者
在每个线程中为
我正在使用Core Data工作在我的持久层,并发现Core Data不是线程安全的,因此需要将NSManagedObjectContext限制在每个线程中。
因此,我的方法是创建自定义后台线程NSManagedObjectContext来执行获取、保存等操作,同时创建主线程NSManagedObjectContext来从获取的NSManagedObjectId中获取NSManagedObject并将其传递给调用者方法。
默认情况下,Xcode为所有NSManagedObjectContext、NSManagedObjectModel等生成与Core Data相关的模板代码,使用lazy var。
所以我的问题是是否要使用lazy var实例化方法来创建NSManagedObjectContext,前提是lazy var会为每个试图访问它的线程初始化一个对象(不是线程安全的?)
或者
在每个线程中为
NSManagedObjectContext
声明单独的变量,并使所有与线程相关的方法引用两个不同的NSManagedObjectContext
,前提是lazy var
是线程安全的,并且只有在访问它时才创建一次,不管线程如何。谢谢!编辑:任何遇到Core Data并发问题的人,this article都提供了一个非常好的设计模式,正如Aaron在下面的评论中指出的那样!
NSManagedObjectContext
不是线程安全的,因此您不应该从不同的线程访问它。 - Aaron BragerNSManagedObjectContext
实例,并强制在后台线程执行的方法仅访问先前在相同后台线程中创建的NSManagedObjectContext
。谢谢。 - Daniel Shinlazy threadsafe var
)会很好。此外,许多var
通常是UIKit对象,大部分情况下必须在主线程上访问。然而,更Swift的解决方案是传递不可变值类型,这样就不需要锁定了。 - Aaron Brager