我编写了一个包含持久存储、对象模型和对象上下文的核心数据抽象类。为了使多线程更容易,我为对象上下文编写了访问器,以便它返回一个实例,该实例仅可用于当前线程,通过使用[NSThread currentThread]
来标识线程。
只要我不使用 GCD,它就可以完美地工作,我想用它来代替旧的 NSThread。所以我的问题是,我如何识别 GCD 线程?这个问题适用于 iOS 和 Mac OS X,但我猜这两个平台都是一样的。
我编写了一个包含持久存储、对象模型和对象上下文的核心数据抽象类。为了使多线程更容易,我为对象上下文编写了访问器,以便它返回一个实例,该实例仅可用于当前线程,通过使用[NSThread currentThread]
来标识线程。
只要我不使用 GCD,它就可以完美地工作,我想用它来代替旧的 NSThread。所以我的问题是,我如何识别 GCD 线程?这个问题适用于 iOS 和 Mac OS X,但我猜这两个平台都是一样的。
您可以检查 dispatch_get_current_queue() 是否返回任何内容。我喜欢 Jeremy 的想法,即使用队列的上下文存储转换到每个队列的 CD 上下文而不是每个线程的 CD 上下文模型。
也许您可以使用 dispatch_set_context()将每个线程的 CD 上下文存储在 GCD 上下文中
Magical Record 中的 contextForCurrentThread 辅助方法与所说的非常相似(即每个线程保留一个上下文)。GCD 执行块在单个队列上运行时,可能会在 GCD 管理的任何线程上运行,这将导致一些随机崩溃。检查这篇文章:http ://saulmora.com/2013/09/15/why-contextforcurrentthread-doesn-t-work-in-magicalrecord/