我正在使用Magical Record 2.3.0 beta 5,我很难理解如何获取当前线程的NSManagedObject
。我有一个很长的NSOperation
,我需要PSPlayer
(NSManagedObject
)。
当我初始化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);
});
欢呼声, 扬
答案 0 :(得分:0)
您需要确保在获取工作之前保存并合并所有内容。如果你正在使用MR,那么最好采用托管对象并在其上调用inContext:
提供其他上下文并让它完成工作(它也避免使用谓词)。
我希望崩溃是因为您使用player.md5Id
而不是self.playerMD5Id
,因此您可以访问错误线程上的托管对象。