在我的一个NSManagedObject
子类中,我想要findOrCreateByExternalId:inContext:
类方法。除了保存上下文外,它确实很简单。在创建的情况下,可以有以下几种变体:
最后一个(但并非最不重要的)变种:
我认为第一个太糟糕了,因为调用者方面的开销太大而且第三个因为可能无法预测的结果而太糟糕了。
同步保存似乎是最安全的方法,但我应该只保存新创建的对象而不是整个提供的上下文。
现在我的解决方案是这样的(使用MagicalRecord):
+ (instancetype)findOrCreateWithExternalId:(NSString *)externId inContext:(NSManagedObjectContext *)context { XXObj *obj = [XXObj MR_findFirstByAttribute:@"externId" withValue:externId inContext:context]; if (obj == nil) { __block XXObj *newObj = nil; [MagicalRecord saveWithBlockAndWait:^(NSManagedObjectContext *localContext) { newObj = [XXObj MR_createEntityInContext:context]; newObj.externId = externId; }]; obj = [newObj MR_inContext:context]; } return obj; }
这种做法是否合理安全?