在Mac和iPhone上共享模型

3

我目前正在研究统一我的应用程序模型。目前在Mac/iPhone上使用的是不同的模型。由于缺少类(NSAttributedString)和技术(Bindings),因此我做出了这个决定。

随着SDK 3.2中第一个限制的消除以及我计划创建一个优化的iPad版本,我正在重新考虑我的决定。由于我还需要在我的模型中存储NSPoints/CGPoints、NSRect/CGRects、NSColor/UIColor和NSImage/UIImage结构/对象,所以我不确定处理它们的最佳方法是什么。

编写自己的MNColor对象,根据不同的架构封装NSColor和UIColor? 编写自己的rect-functions,根据架构调用适当的函数?或者在Mac上在模型中使用CGRect?

非常感谢任何意见!

4个回答

2

CorePlot 是一个适用于iPhone和Mac OS X的优秀Cocoa绘图框架。
它在两个平台上共享通用代码 - 通过浏览它们的源代码,您可能会得到一些想法。

对于一些跨平台问题,CP使用特定于平台的定义在单独的头文件中来获取“不可知”图像类。
每个平台的Xcode项目包括相应的头文件:

它们还有一个自定义颜色类CPColor。(基于CGColorRef

对于NSPointNSRect,我会在模型中使用Core Graphics结构体,并根据需要使用NSRectFromCGRectNSPointFromCGPoint进行转换。(Mac OS 10.5+)

最近的CIMGF文章也涉及了iPhone / Mac不兼容性:
创建跨平台的NSManagedObject


建议使用CG类型并根据需要进行转换。我曾经使用过一种不太干净的替代方法(情况有些不同,我正在处理可能会变化的方法返回类型),那就是使用预处理器来定义NSCGPoint,这最终取决于平台的正确类型。 - Colin Barrett

2
我可能误解了你的设置和问题,但听起来你的数据模型缺乏抽象性。
严格来说,“NSPoints/CGPoints,NSRect/CGRects,NSColor/UIColor和NSImage/UIImage结构/对象”都是实现/UI元素,与数据模型无关。当然,API使得存档这些内容变得容易,但这会让你陷入你现在遇到的问题。你正在保存附加到特定硬件和特定实现的对象/结构体,现在你可以轻松地移植/重用它们。
更好的方法是创建一个不知道硬件或API的抽象数据模型。它应该将所有的NSPoints/CGPoints、NSRect/CGRects存储为字符串或数字。它应该将颜色存储为数字、字符串或原始数据。图像应该以原始数据的形式存储。
这样,你的应用程序核心即实际操作的数据是通用的。要显示信息,你只需要让控制器请求原始数据,并让控制器将其转换为硬件/API特定的结构/对象。
Core Data提供了一个良好的抽象数据模型示例。它仅存储字符串、数字、日期、布尔值等,但它可以为任何支持Core Data的平台存储任意复杂度的信息。
即使你不使用Core Data,也应该朝着这种类型的数据模型努力。

有趣的评论,然而应用程序的主要目标是显示图形,抽象出图形属性似乎并不必要。我可能在第一次发布问题时就应该提到这一点。 - Markus Müller-Simhofer
你会惊讶地发现,即使在不保存任何数据的程序中,数据模型也会出现得很多。每当你需要跟踪数据之间的逻辑关系时,比如位置、颜色等,你就进入了数据模型的领域。我敢打赌 Core Plot 就遵循了这种模式。它将拥有一个平台无关的抽象模型来描述它所绘制的内容,然后再具有平台特定的方法来实际显示。 - TechZen

1

编写自己的rect函数,根据架构调用相应的函数-这将很好。

编写自己的MNColor对象,封装NSColor和UIColor-如果您的包装类设计能够处理跨平台的MNColor对象,那将是很好的。即,如果从Mac导入到iPhone的数据库现在应该能够通过您的包装器提供UIColor对象,而不是NSColor。


0

这取决于您的使用方式,但我不建议将图像存储在数据库中。最好将它们放在文件系统中,并在数据库中存储图像的路径(也许)。

唯一可以看到通过将图像存储在数据库中获得任何收益的情况是,如果您想要一个文件系统单元,您可以移动它并移动所有内容。虽然对于 iPhone 来说,这不是一个可能的用例。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接