0

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

我正在考虑使代码/块成为 NSThread,然后我可以调用 [theThread cancel]。但是,鉴于我无法将属性添加到 NSManagedObject 类别,如何将 NSThread 与我的 NSManagedObject 关联?将属性添加到 NSManagedObject 本身的定义中是否可以?似乎是合法的,但我猜对核心数据模型的后续更改会覆盖我的代码。

但也许有一种完全不同的更好的方法来完成我想做的事情?有任何想法吗?

4

1 回答 1

2

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

其次,跨线程使用 NSManagedObject 非常非常糟糕。如果你只做非常微不足道的事情,那么做正确的事情也会变得非常困难。

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

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

编辑

好的,让我和你一起检查一下。我目前正在做的是产生一个背景上下文,使用 performBlock 创建一个新的 NSManagedObject,然后保存该背景上下文,切换到父上下文(使用 performblock),使用 existingObjectWithId: 在该上下文中获取新创建的对象。然后,我创建了一个 NSOperation 子类,将 NSManagedObject(来自父上下文)绑定到该 NSOperation 子类(它是子类的一个属性),并将该操作放在 NSOperationQueue 中。在该 NSOperation 中,NSManagedObject 被更改。它似乎工作正常,看起来还可以吗?– 用户 1013725

嗯……也许???我没有遵循。你能发布代码吗?那会更精确,更容易理解。

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

不。

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

如果它是用alloc] initWithConcurrencyType:NSMainThreadConcurrencyType然后创建的,那么只有当您知道您在主线程上在其中一种performBlock方法中运行时,您才必须使用它。

于 2012-09-12T18:39:02.593 回答