当前线程的魔法记录对象

时间:2015-01-31 10:20:18

标签: objective-c core-data magicalrecord

我正在使用Magical Record 2.3.0 beta 5,我很难理解如何获取当前线程的NSManagedObject。我有一个很长的NSOperation,我需要PSPlayerNSManagedObject)。

当我初始化NSOperation时,我保留了PSPlayer的id并在操作的main方法中重新获取相同的对象。根据{{​​3}}说明的方法。

@implementation TAPlayerUpdateOperation 

- (instancetype)initWithPlayer:(PSPlayer *)player;
{
    self = [super init];
    if (self) {
        self.playerMD5Id = player.md5Id;
    }
}

- (void)main
{
    @autoreleasepool {

        __block BOOL keepUpdating = YES;
        PSPlayer *player = [[PSPlayer MR_findAllWithPredicate:[NSPredicate predicateWithFormat:@"md5Id == %@", self.playerMD5Id]] firstObject];
        NSLog(@"player.md5Id = %@", player.md5Id);
        // rest of my operation logic
    }
}
@end

当我使用-com.apple.CoreData.ConcurrencyDebug 1运行我的应用程序时,在访问NSLog语句中的属性时出现崩溃。

获取NSManagedObject以使其对当前线程安全的正确方法是什么?

我已将问题归结为以下代码片段,它也崩溃了。

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
    PSPlayer *player =[[PSPlayer MR_findAll] firstObject];
    NSLog(@"player = %@", player.name);
});

欢呼声, 扬

1 个答案:

答案 0 :(得分:0)

您需要确保在获取工作之前保存并合并所有内容。如果你正在使用MR,那么最好采用托管对象并在其上调用inContext:提供其他上下文并让它完成工作(它也避免使用谓词)。

我希望崩溃是因为您使用player.md5Id而不是self.playerMD5Id,因此您可以访问错误线程上的托管对象。