我不能在Swift项目的两个目标中使用我的核心数据模型
核心数据模型中实体模型的类名称必须具有应用程序名称。 因此,对于名为User的实体,模型编辑器中的类名称必须是MyAppName.User。 这工作正常,直到我添加了第二个目标到我的项目。
新项目期望实体类名称为SecondAppTargetName.User。 我们如何使用相同的核心数据模型支持两个目标? 我试着预先join$ {PRODUCT_NAME} .User,而不是期待它的工作。 它不起作用。
关于如何在目标之间共享一个核心数据模型以及如何满足Swift项目在模型编辑器中将PRODUCT_NAME预先添加到类中的想法?
编辑:从这里的苹果文件显示,模块实体检查器中的类名添加模块名称作为前缀是首选的行为。 如果是这样,这看起来像一个大洞,因为它排除了多个目标使用相同的数据模型。 我仍然没有find解决办法。 在这里的一些post已经表明,在托pipe对象的Swift类定义之前使用@objc(ClassName)将做到这一点,但我还没有能够validation。
事实certificate,答案似乎是在Swift文件的类定义之上添加@objc(ClassName)指令,如在这个StackOverflow回答中提到的有关相关问题。 至less这是XCode 6 beta 5在这个阶段的答案。
所以对于一个名为User的实体类,您需要:
@objc(User) class User: NSManagedObject { ...
我已经在一个双目标项目中testing了这一点,并从模型实体检查器中删除了所有的前缀,它的工作原理。 我想知道为什么苹果会在他们的文档中包含前缀要求,因为它使用相同的核心数据模型对多个目标施加限制。 看起来@objc修复是适当的解决scheme,或者可能只是在这个testing阶段的临时解决scheme。
我用这种方式使用target来修复它。 我不确定这是否是正确的方法。 我将不胜感激。 这样,它创build了两个不同的商店和相应的文件。两个应用程序可以在同一个设备上使用两个不同的商店。
if(currentTarget==XXX){ storeURL = [[self applicationDocumentsDirectory] URLByAppendingPathComponent:@"Partner.sqlite"]; } else{ storeURL = [[self applicationDocumentsDirectory] URLByAppendingPathComponent:@"PartnerNew.sqlite"]; }
虽然可以通过@objc技巧再次运行,但是代码可能存在更深层次的问题。 我经历了一系列不同的错误消息,直到我发现我不应该使用
myClass.className()
在任何核心数据操作中。 我只是试图太聪明。 改为使用带有类名的string。