我正在创建具有某些属性的NSManagedObject(子类)。同时,我正在执行一些代码/块,它根据我的NSManagedObject的属性执行一些网络操作。现在,有时网络操作可能会失败或耗时太长,所以我想添加取消执行该代码/块的功能。
我正在考虑让代码/阻塞成为NSThread,然后我就可以调用[theThread cancel]了。但是,我如何将NSThread与我的NSManagedObject相关联,因为我无法向NSManagedObject类添加属性?是否可以将属性添加到NSManagedObject本身的定义中?看起来很合法,但我猜测后续对Core Data模型的更改会覆盖我的代码。
但也许有一种完全不同的更好的方法可以完成我想做的事情?有什么想法吗?
答案 0 :(得分:2)
首先,新代码确实应该比NSThread更喜欢GCD或NSOperationQueue。如果您发现自己正在使用NSThread
,那么就应该放慢速度并重新审视您的设计和实施要求。
其次,跨线程使用NSManagedObject确实非常糟糕。如果你做了一些非常微不足道的事情,那么做起来也很困难。
最后,无论您如何进行线程化网络访问,您都应该更喜欢从托管对象中获取数据,并传递而不是托管对象本身
如果必须访问托管对象,请确保托管对象上下文为NSMainQueueConcurrencyType
或NSPrivateQueueConcurrencyType
,并通过调用performBlock
或performBlockAndWait
来访问托管对象使用托管对象的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
方法中的主线程或上运行时,才能使用它。