0

我想要做的是:

Product *product = [fetchResult lastObject];

NSString *productID = product.atProductID;

dispatch_async(queue, ^(void){
// Something with productID like
NSLog(@"productID is %@", productID);
});

这样做是否安全,或者我是否需要为我的辅助队列创建另一个上下文并通过其内部 ID 获取产品,然后处理其 atProductID 属性?

更新: 嗯,它表明这实际上是不安全的。一个简单的解决方案是制作一个 productID 字符串的副本:

Product *product = [fetchResult lastObject];

NSString *productID = [product.atProductID copy];

dispatch_async(queue, ^(void){
// Something with productID like
NSLog(@"productID is %@", productID);
});

这将是安全的,因为您不会在后台线程上保留对上下文或其派生的任何引用。这样做的原因是上下文缓存了它从持久存储中获取的数据,并且它自己管理该缓存。而且,无论您是否保留指向该缓存的指针,它都可能更改或销毁它,除非它在上下文的线程上使用。

4

2 回答 2

0

你的代码看起来不错。如果您打算对它做一些事情,例如长提取或更改托管对象,您只需要一个单独的托管对象上下文。

Also, you can use the variables in the scope of your async block without problem. That's the great advantage of CGD. These threads have contained memory, so I would expect strings to be copied. You can check by logging the pointer address.

于 2012-12-20T11:48:25.973 回答
-1

以前没有使用过 dispatch_async 但这段代码对我来说看起来并不健康

您正在使用在一个线程中创建的变量并将其直接传递到另一个代码块。这样做的正确方法是将对象/参数传递给方法。

需要注意的一件事是,您的问题并非 100% 准确。当你执行

NSString *productID = product.atProductID;

您正在创建一个与您的 NSManagedObject(即产品)没有关联的全新 NSString 对象。因此,您的问题是关于为 dispatch_async 传递参数,并且与 NSManagedObjects 没有太大关系

于 2012-12-20T11:30:46.103 回答