问题标签 [ensembles]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
322 浏览

ios - 使用 Core Data 和 Ensembles (iCloud) 删除附近的重复项

概括

我的问题是,我想在使用Ensembles与 iCloud 同步的基于 Core Data 的 iOS 项目中去除几乎重复的内容。

  • 与 iCloud 的同步在我的应用程序中运行良好。
  • 问题是当用户在他的持久存储被 Ensembles(连接到 iCloud)窃取之前在多个设备上创建类似的对象时。
  • 这会产生近乎重复的事实,这实际上是正确的。
  • 我删除这些重复项的方法似乎不起作用。

详细问题

用户可以NSManagedObjects在连接到 iCloud 之前在不同的设备上创建。假设他有一个NSManagedObject名称,该名称与一个名称Car具有“对一个”关系,而该名称与一个NSManagedObject名称Person具有“对多”关系Car。这看起来像这样: 简化模型

好的,假设用户有两个设备,他NSManagedObjects在每个设备上创建了两个。一个Car叫“奥迪”,一个Person叫“拉斐尔”。两者都是通过关系联系在一起的。在另一台设备上,他创建了一个Car名为“BMW”和另一个Person名为“Raphael”的设备。也相互连接。现在用户在每台设备上都有两个相似的对象:两个Person对象都名为“Raphael”。

我的问题是,用户在同步后最终会Person在每台设备上拥有两个名为“Raphael”的对象。

这实际上是正确的,因为当用户窃取他的持久存储时,对象会获得它们的唯一标识符(以识别 Ensembles 中的对象)。对象实际上是不同的。但这是我想要解决的。

我的方法

我实现了这个委托方法并删除了 reparationContext 中的重复项。

基本上,这似乎在合并来自第一个设备的数据的第二个设备上运行良好。但不幸的是,即使在reparationContext中被删除,本地人似乎仍然同步到iCloud。

这会导致损坏状态,因为第一台设备随后还会合并来自第二台设备的更改并再次替换已在第二台设备上删除的人员。稍后进行一些同步,该人最终在汽车关系中丢失,并且应用程序引发同步错误。

重现问题的步骤

  • 第 1 步(设备 1)

    • 创建对象
    • 数据:汽车“奥迪”-> 人“拉斐尔(设备 1)”
  • 第 2 步(设备 2)

    • 创建对象
    • 数据:汽车“BMW”-> 人“Raphael(设备 2)”
  • 第 3 步(设备 1)

    • 来自商店的水蛭数据
    • 连接到 iCloud
    • 将数据发送到 iCloud
    • 数据:汽车“奥迪”-> 人“拉斐尔(设备 1)”
  • 第 4 步(设备 2)

    • 来自商店的水蛭数据
    • 连接到 iCloud
    • 合并来自 iCloud 的数据
    • 将设备 2 中的本地人员替换为设备 1 中的插入人员
    • 从设备 2 中删除本地人
    • 将数据发送到 iCloud
    • 数据:
      汽车“Audi” -> 人“Raphael(设备 1)”
      汽车“BMW” -> 人“Raphael(设备 1)”
  • 第 5 步(设备 1)

    • 合并来自 iCloud 的数据
    • 将设备 1 中的本地人员替换为设备 2 中的插入人员(这不应该发生)
    • 从设备 1 中删除本地人(这不应该发生)
    • 将数据发送到 iCloud
    • 预期数据:
      汽车“Audi” -> 人“Raphael(设备 1)”
      汽车“BMW” -> 人“Raphael(设备 1)”
    • 实际数据:
      汽车“Audi” -> 人物“Raphael(设备 2)”
      汽车“BMW” -> 人物“Raphael(设备 2)”

实际上,本地人员对象“Raphael (Device 2)”在第 4 步中被删除,但它似乎仍被发送到 iCloud,因为在第 5 步中它作为委托方法 savingContext.insertedObjects的插入弹出。shouldSaveMergedChangesInManagedObjectContext

据我了解,Ensembles 首先从 iCloud 中提取更改,通过委托方法询问用户是否一切都符合预期,然后合并到持久存储中,并在合并后将增量发送到 iCloud。

难道我做错了什么?或者这是一个集成错误?

0 投票
1 回答
857 浏览

ios - XCode 找不到第 3 方库的标头

我正在尝试将 Ensembles 2 框架添加到我的 iOS 项目中(从开源 Ensembles 1 切换,v2 不是开源的,所以我无法再访问代码或可可豆荚)。

我想我遵循了安装说明:

  1. 拖入框架(和.bundle)
  2. 确保选择了目标和“复制项目”
  3. 确保 -ObjC 已设置

XCode 将框架复制到 $(PROJECT_DIR) 中,该 $(PROJECT_DIR) 也在框架搜索路径(以及其他目录)中设置。<Ensembles/Ensembles.h>但无论我尝试什么,它似乎都找不到。我在 SO 和其他地方搜索了类似的问题,并尝试了框架搜索路径设置和标题搜索路径设置的各种组合,但到目前为止还没有成功。具体来说我试过

  • 在现有框架搜索路径设置中添加和删除引号
  • 使用递归设置
  • 创建一个框架子目录并在那里添加框架。然后添加"$(SRCROOT)/Frameworks框架搜索路径标题搜索路径(递归和非递归)
  • 添加"$(SRCROOT)/Frameworks/Ensembles/Headers"标题搜索路径
  • 多次删除、清理和重新添加框架

这越来越令人沮丧。还有其他想法吗?我正在使用 XCode 7.2.1 顺便说一句。

0 投票
1 回答
315 浏览

ios - 集成和核心数据轻迁移

我目前正在使用 Ensembles 进行一些测试,特别是测试 Core Data 轻迁移。

我目前的配置如下:

  • 使用数据模型 1 运行我的应用程序的设备 A
  • 使用数据模型 2 运行我的应用程序的设备 B
  • 数据模型 2 基于数据模型 1,具有一个附加的字符串属性,该属性是可选的

我的情况如下:

  • 一开始,在 Device-A 和 Device-B 上使用数据模型 1 运行我的应用程序,使用 Ensembles(iCloud 配置)同步一切正常
  • 在 Device-B 上,使用数据模型 2 安装并运行我更新的应用程序
  • 在 Device-A 上,继续使用数据模型 1 运行我的旧应用程序,并添加一条新记录
  • 结果:在Device-A上添加的新记录上传到iCloud,然后同步到Device-B

我的问题:如果相关数据模型不是最新的,我可以配置 Ensembles 以防止其将更改上传到 iCloud?(即在我的情况下,设备 A 上传基于数据模型 1 的对象,而 iCloud 已经基于数据模型 2)

提前致谢!

更新 1:

德鲁,非常感谢你的回答。我绝对同意不能(也可能不应该)阻止上传,因为 Ensembles 是一个去中心化的点对点系统。

在理想情况下,我希望具有新数据模型的设备将忽略基于旧数据模型的数据。(以类似于现有行为的方式,具有旧数据模型的设备将忽略基于新数据模型的任何数据)。支持吗?

如果不是,请以以下场景为例:

  • 旧数据模型有一个名为“Book”的实体,它有两个属性:标题和作者(这两个字段都是非可选的)
  • 新数据模型有一个名为 titleFirstLetter 的新可选属性,它应该包含标题字段的第一个字母。

目前,当不涉及 Ensembles 时,我可以完全控制将新的 NSManagedObject 保存到持久存储。因此,我负责添加新书的应用程序的更新代码将确保从标题字段中提取第一个字母并将其保存到新的 titleFirstLetter 属性中。(即保存书时,标题为 Catch-22 的书的 titleFirstLetter 属性中将包含 C)。

另外,当核心数据栈发生轻迁移时,我检测到这一点,并执行一次性程序,迭代数据库中所有现有书籍,并根据标题值设置titleFirstLetter。从现在开始,数据库是一致且有效的,而新代码将确保将来添加到数据库中的书籍将保持数据库有效。

关于 Ensembles,如果我对来自具有旧数据模型的设备的旧数据没有任何控制权,如果我的代码从未被调用,我该如何填充 titleFirstLetter 的新属性?

感谢您的热心帮助!

0 投票
1 回答
371 浏览

ios - 合奏和 journal_mode="DELETE"

我当前的核心数据堆栈配置为 journal_mode="DELETE" 如下:

此代码强制核心数据创建单个 sqlite 文件(而不是 WAL 模式下的 3 个不同文件),这使我在备份和恢复 sqlite 数据库到用户的 Dropbox 时的工作更加轻松。(我只需要备份或恢复一个文件而不是三个)

当我添加 Ensembles 代码时,它似乎覆盖了 NSSQLitePragmasOption 并删除了我的自定义 DELETE journal_mode。我可以得出结论,因为在添加 Ensembles 代码之后,我可以看到生成了三个 sqlite 文件,而不仅仅是一个。

这是 Ensembles 的已知要求/行为吗?Ensemble 只能在 WAL 日志模式下正确运行,还是我可以将其配置为也使用 DELETE 日志模式?

提前致谢。

0 投票
1 回答
96 浏览

ios - 合奏:我应该为图像选择什么类型的全局标识符?

我目前正在实现 persistentStoreEnsemble:globalIdentifiersForManagedObjects: 委托,并且很难决定要提供什么全局标识符。

我的核心数据模型有两个实体:书籍和图像。

对于书籍对象,没有问题,因为我可能应该返回一个 UUID,它应该存储在书籍的专用属性中。

但是,我不确定图像的全局标识符。请注意,图像和书籍实体在数据模型中具有一对一的关系,具有“级联”删除规则,这意味着一旦删除了一本书,链接的图像也将被删除。因此,如果没有链接到书,图像就不能存在于数据库中。

基于上述描述,我想知道是否应该返回 NSNull、UUID 或哈希码(在运行时从图像数据计算)作为给定图像对象的全局标识符?

感谢您的任何建议。

0 投票
1 回答
55 浏览

ios - 在 Ensembles 合并时我应该避免保存到持久存储吗?

我目前正在使用 Ensemble 实现核心数据同步,我想知道是否应该在 CDEPersistentStoreEnsemble 合并时阻止用户保存到核心数据?

由于mergeWithCompletion的方法文档,我问这个:

合并可能由于多种原因而失败,从文件下载不完整到合并被保存到持久存储中中断。合并期间的错误通常不是很严重,您应该稍后重试合并。错误代码可以在 CDEDefines 中找到。

-(void)mergeWithCompletion:(CDECompletionBlock) 完成;

0 投票
1 回答
584 浏览

ios - 没有这样的模块'Ensembles'错误-导入objective-c框架以在swift项目中使用

我将 Ensembles 添加到我的 Swift 项目中 - 在这里找到https://github.com/drewmccormack/ensembles。我没有运气为我的应用程序添加 iCloud 支持并跨设备同步数据,所以希望这能奏效。

我已按照以下说明将框架添加到我的应用程序,

  1. 在 Finder 中,将 Ensembles iOS.xcodeproj 项目从 Framework 目录拖到您的 Xcode 项目中。
  2. 在左侧的源列表中选择您的 App 的项目根目录,然后选择 App 的目标。
  3. 在 General 选项卡中,单击 Linked Frameworks and Libraries 部分中的 + 按钮。
  4. 选择 libensembles.a 库并添加它。
  5. 选择构建设置选项卡。找到 Other Linker Flags 设置,并添加标志 -ObjC。

    这就是它在我的项目中的样子,我不确定我是否正确地完成了这一步。

在此处输入图像描述

  1. 选择构建阶段选项卡。打开目标依赖项,然后单击 + 按钮。
  2. 找到 Ensembles Resources iOS 产品,并将其添加为依赖项。
  3. 打开源列表中的 Ensembles iOS.xcodeproj 项目,然后打开 Products 组。
  4. 将 Ensembles.bundle 产品拖到应用程序的 Copy Bundle Resources 构建阶段。
  5. 在预编译的头文件或使用 Ensembles 的任何文件中添加以下导入。

我遇到问题的是第 10 步。我必须创建一个桥接头还是将框架导入到我的 swift 文件中?

这就是我在CoreDataStack.swift文件中导入的方式

这给了我错误;

没有这样的模块“合奏”

我尝试通过执行以下操作来创建桥接头;

  • 添加新的头文件
  • 导入合奏

这就是它的样子;

但是仍然没有运气,有人知道我在尝试导入框架以与我的 swift 项目一起使用时哪里出错了吗?

0 投票
0 回答
1012 浏览

ios - 如何在 Swift 项目中使用 Ensembles 框架

我有一个已经使用 Core Data 的项目。我添加了对 iPad 的支持,但现在需要使用 iCloud 和 Core Data 来同步数据。

我遇到了 Ensembles,它似乎是一个简单而强大的框架,可以添加到我的项目中。在这里找到:https ://github.com/drewmccormack/ensemble

然而,Ensembles 项目没有 Swift 示例项目,所以我尝试自己做。这是我采取的步骤,

步骤1

手动将 Ensembles 添加到 iOS 项目。

第2步

使用现有的持久存储 .sql 文件创建新的 CoreDataStack。

第 3 步

更新 App Delegate 以同步和添加通知

第4步

向项目添加通知以刷新 UI

第 5 步

观看魔术发生。不幸的是,没有魔术自动取款机。新的 CoreDataStack 工作正常,我可以从持久存储中保存和检索数据。

我有两台设备登录到同一个 iCloud 帐户,并且没有数据共享给另一台设备。

删除应用程序并重新安装时,不会从 iCloud 中检索数据并保存到持久存储中。

NSLog“有时”保存数据或加载应用程序时,我确实得到以下信息。

这是以下 appDelegate 通知函数的结果

当合并更改时,CoreDataStack 中的此函数会发送通知。

所以一切似乎都应该正常工作。我没有收到任何错误,但数据没有同步。我无法判断问题是数据备份到 iCloud 还是从 iCloud 检索并与持久存储合并。我所能说的是,数据不会在使用相同 iCloud 帐户的设备之间共享,并且在重新安装应用程序时,该应用程序实际上并没有从 iCloud 恢复数据。

0 投票
1 回答
72 浏览

ios - 使用 Ensembles 更改 Core Data 对象的全局标识符

我正在阅读 Ensembles 文档,其中全局标识符在对象生命周期内永远不应该改变。但是,我有一个 Tag 对象,它只包含一个名称属性(一个字符串)。同样根据 Ensembles 文档,标签名称可以作为全局标识符返回,这实际上比返回 UUID 更好,原因很明显。

我的问题是,由于允许用户在我的应用程序中重命名标签,我应该从数据库中删除标签对象并重新创建它,还是重命名标签对象被认为是安全的?(重命名标签对象会导致应用返回新的标签名称作为全局标识符,这似乎与对象整个生命周期内不更改全局标识符的警告冲突)

谢谢。

0 投票
1 回答
160 浏览

ios - 适用于 iOS 的 Ensembles:我应该使用哪种类型的 iCloud 后端?

我希望在基于 Ensembles 的应用程序中支持 iCloud 后端,以便用户可以使用他们内置的 iCloud 帐户进行同步。但是,我不确定我应该使用 iCloud Drive 后端还是 CloudKit 后端,因为它们似乎都允许使用用户的 iCloud 帐户进行同步。

关于使用哪个后端的任何建议?

我的应用需要 iOS 8.0 或更高版本。

提前致谢。