将NSThread与NSManagedObject相关联

时间:2012-09-12 05:40:08

标签: ios core-data nsmanagedobject nsthread

我正在创建具有某些属性的NSManagedObject(子类)。同时,我正在执行一些代码/块,它根据我的NSManagedObject的属性执行一些网络操作。现在,有时网络操作可能会失败或耗时太长,所以我想添加取消执行该代码/块的功能。

我正在考虑让代码/阻塞成为NSThread,然后我就可以调用[theThread cancel]了。但是,我如何将NSThread与我的NSManagedObject相关联,因为我无法向NSManagedObject类添加属性?是否可以将属性添加到NSManagedObject本身的定义中?看起来很合法,但我猜测后续对Core Data模型的更改会覆盖我的代码。

但也许有一种完全不同的更好的方法可以完成我想做的事情?有什么想法吗?

1 个答案:

答案 0 :(得分:2)

首先,新代码确实应该比NSThread更喜欢GCD或NSOperationQueue。如果您发现自己正在使用NSThread,那么就应该放慢速度并重新审视您的设计和实施要求。

其次,跨线程使用NSManagedObject确实非常糟糕。如果你做了一些非常微不足道的事情,那么做起来也很困难。

最后,无论您如何进行线程化网络访问,您都应该更喜欢从托管对象中获取数据,并传递而不是托管对象本身

如果必须访问托管对象,请确保托管对象上下文为NSMainQueueConcurrencyTypeNSPrivateQueueConcurrencyType,并通过调用performBlockperformBlockAndWait来访问托管对象使用托管对象的managedObjectContext属性。

修改

  

好的,我来和你核实一下。我目前正在做的是产生一个   backgroundContext,使用performBlock创建一个新的NSManagedObject,   然后保存该背景上下文,切换到父上下文(使用   performblock),使用获取该上下文中新创建的对象   existingObjectWithId :.然后,我创建一个NSOperation子类,绑定   NSManagedObject(从父上下文)到该NSOperation子类   (它是子类的属性)并将该操作放在一个   NSOperationQueue。在那个NSOperation中,NSManagedObject得到了   改变。它看起来工作正常,看起来不错吗? - user1013725

嗯...也许???我没跟那个。你能发贴一下代码吗?这将更精确,更容易理解。

  

@JodyHagins所以我没有使用performBlock,但也许没关系   因为managedObjectContext是主要的上下文? - user1013725

没有

如果主要上下文是使用alloc] init]alloc] initWithConcurrencyType:NSConfinementConcurrencyType创建的,那么只有在知道自己在主线程上运行时才必须使用它。

如果是使用alloc] initWithConcurrencyType:NSMainThreadConcurrencyType创建的,那么只有当您知道自己正在其中一个performBlock方法中的主线程上运行时,才能使用它。