加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-14 19:58:08 所属栏目:百科 来源:网络整理
导读:我已经写了几个Core Data iPhone应用程序,我遇到了一个一直存在的问题,我希望这个问题是iPhone开发的常见模式.也就是说,我有一个或多个命令行数据加载器来创建Core Data数据库,然后我有我的iPhone应用程序.由于模型文件是共享的,并且加载器是项目的一个组成
我已经写了几个Core Data iPhone应用程序,我遇到了一个一直存在的问题,我希望这个问题是iPhone开发的常见模式.也就是说,我有一个或多个命令行数据加载器来创建Core Data数据库,然后我有我的iPhone应用程序.由于模型文件是共享的,并且加载器是项目的一个组成部分,我希望它是一个单独的项目.

使用iPhone OS目标和命令行目标创建项目的正确方法是什么?我的所有尝试都没有奏效 – 我有代码签名,调试和配置问题.

到目前为止,这是我最好的尝试:

>创建一个iPhone项目
>添加新的Cocoa Shell Tool目标
>在目标的构建配置中将基本SDK更改为“当前Mac OS”

此时我没有可执行文件. (相反,如果您创建一个新的Command Line Utility项目,则可执行文件会自动与您的目标关联.)

如果我创建一个自定义可执行文件,那么我有一些麻烦:(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应用程序预先填充数据库,并且您希望让该工具与最新的Core Data模型保持一致.我对吗?

如果我的理解是正确的.我想,不是创建一个专用的命令行工具来预先填充数据库,而是在单元测试目标中执行它将是一个更好的选择.

我的解决方案

这是我正在使用我的核心数据iOS应用程序.

>使用核心数据支持和逻辑测试支持创建项目.
>编写一个简单的测试用例来访问MOC和Model来填充数据库文件.
>同时,编写另一个测试用例来读取数据文件,执行繁重的导入工作.

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

一些好处

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

做一些事情.

>如果您使用的是Xcode 4.1,我建议您升级到Xcode 4.2甚至Xcode 4.3,因为Xcode 4.1,您将无法直接访问MOC和模型文件. (至少,根据我的经验)Xcode 4.2支持单元测试应用程序直接访问文档文件夹中的数据库文件.稍后您需要做的就是找到sqlite文件并覆盖项目中的文件.
>如果您无法迁移到Xcode 4.2,请记住将核心数据建模文件添加到逻辑测试目标,并使用[NSBundle bundleForClass:{Your testcase class name}]来获取正确的包路径,从而可以加载Core数据模型并创建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];

  }];

}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读