gpt4 book ai didi

iphone - 如何为不同平台(iPhone 和 Mac OS X)创建具有多个目标的 xcode 项目?

转载 作者:行者123 更新时间:2023-12-03 18:36:30 25 4
gpt4 key购买 nike

我编写了几个 Core Data iPhone 应用程序,并且遇到了一个一致的问题,我认为这将成为 iPhone 开发的常见模式。也就是说,我有一个或多个命令行数据加载器来创建 Core Data 数据库,然后我就有了我的 iPhone 应用程序。由于模型文件是共享的并且加载器是项目的组成部分,因此我希望它成为一个项目。

创建具有 iPhone OS 目标和命令行目标的项目的正确方法是什么?我的所有尝试都效果不佳——我遇到了代码签名、调试和配置问题。

这是我迄今为止最好的尝试:

  • 创建 iPhone 项目
  • 添加新的 Cocoa Shell 工具目标
  • 在目标的构建配置中将基础 SDK 更改为“当前 Mac OS”

此时我没有可执行文件。 (相比之下,如果您创建一个新的命令行实用程序项目,则可执行文件会自动与您的目标关联。)

如果我创建自定义可执行文件,那么我会遇到一些麻烦:(1) 更改目标不会更改可执行文件,因为您无法将自定义可执行文件链接到目标,(2) 调试命令行程序是有问题,因为 XCode 中设置的断点没有注册(调试可执行文件时,行号处的 V 形变成橙色),所以我必须闯入正在运行的代码,然后从控制台手动处理调试,(3)最令人沮丧的是,如果我创建了 iPhone 应用程序的正确配置的分发版本,则将 iPhone 应用程序传输到设备会失败,并提示配置文件与代码签名权利不匹配。情况绝对不是这样,因为我为 iPhone 目标的分发版本设置了配置文件和权利文件,但无论我如何调整,我都无法在设备上安装目标。 (如果我创建一个具有相同代码和代码签名的新项目,而不使用命令行工具,那么我可以安装 AdHoc 配置的应用程序。)

那么...我还应该遵循其他模式吗? Xcode 配置是严重的巫毒。

最佳答案

好吧,我认为你的问题需要重新定义。

正如您提到的:

Namely, I have one or more command line data loaders to create the Core Data database

您的要求是为您的核心数据iPhone应用程序预填充数据库,而且您还希望让该工具与您最新的核心数据模型保持一致>。 我说得对吗?

如果我的理解是正确的。我想,与其创建专用的命令行工具来预填充数据库,不如在单元测试目标中执行此操作将是更好的选择。

我的解决方案

这是我正在使用我的核心数据 iOS 应用程序所做的事情。

  1. 创建具有核心数据支持和逻辑测试支持的项目。
  2. 编写一个简单的测试用例来访问 MOC 和模型以填充数据库文件。
  3. 同时,编写另一个测试用例来读取数据文件,完成繁重的导入工作。

如果您没有太多数据需要导入,则可以将 2 和 3 集成到一个测试用例中。

一些好处

  1. 您可以使用⌘ + k 删除之前创建的所有内容。
  2. 您可以使用⌘ + u 再次运行测试用例并用数据重新填充数据库。
  3. 始终访问核心数据模型的最新版本。
  4. 最重要的是,所有这些都是由 Xcode 的默认项目模板提供的。您不需要做任何额外的工作来确保两个目标都能正常工作。

要注意一些事情。

  1. 如果您使用的是 Xcode 4.1,我建议您升级到 Xcode 4.2+ 甚至 Xcode 4.3,因为 Xcode 4.1 直接访问 MOC 和模型文件会遇到一些麻烦。 (至少,根据我的经验)并且Xcode 4.2支持单元测试应用程序直接访问文档文件夹中的数据库文件。稍后您需要做的就是找到 sqlite 文件并覆盖项目中的文件。
  2. 如果您无法迁移到 Xcode 4.2+,请记住将核心数据建模文件添加到您的逻辑测试目标中,并使用 [NSBundle bundleForClass:{您的测试用例类名}] 获取正确的捆绑路径,因此您可以加载核心数据模型并创建 MOC 实例。
<小时/>

真实样本

您可以在 github 上的开源项目中了解我是如何做到这一点的

这是我的测试用例中的简短代码。

- (void)setUp
{
[super setUp];

// Set-up CoreData
yourMocObj = ...;
}

- (void)tearDown
{
// Tear-down code here.
[yourMocObj save];
[super tearDown];
}

- (void)test_PopulateData{
// Get the path for the data file.
NSString *plistPath = [[NSBundle bundleForClass:[algorithms_iOSTests class]] pathForResource:@"AlgorithmsMasterViewData" ofType:@"plist"];
NSArray *dataArray = [NSArray arrayWithContentsOfFile:plistPath];

NSEntityDescription *yourEntity = [NSEntityDescription entityForName:.. inManagedObjectContext:yourMocObj];

[dataArray enumerateObjectsUsingBlock:^(NSDictionary *aCategoryDict, NSUInteger idx, BOOL *stop) {
// Category is a custom subclass of NSManagedObject.
Category *aCategory = [[Category alloc] initWithEntity:yourEntity insertIntoManagedObjectContext:yourMocObj];
[aCategory safelySetValuesForKeysWithDictionary:aCategoryDict];

}];

}

关于iphone - 如何为不同平台(iPhone 和 Mac OS X)创建具有多个目标的 xcode 项目?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2163595/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com