Mac和iPhone上的共享模型

时间:2010-02-19 10:05:53

标签: iphone cocoa cocoa-touch macos

我正在考虑统一我的应用程序模型。目前我在mac / iphone上使用了不同的型号。缺少类(NSAttributedString)和缺少技术(Bindings)使我决定采用这个决定。

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

编写我自己的MNColor对象,根据架构封装NSColor和UIColor? 编写我自己的rect函数,根据arch调用相应的函数?或者在Mac上的模型中使用CGRect?

非常感谢任何输入!

4 个答案:

答案 0 :(得分:2)

CorePlot是适用于iPhone和Mac OS X的优秀Cocoa绘图框架 它在两个平台上共享通用代码 - 也许您可以通过浏览their source获得一些想法。

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

他们还有自定义颜色类CPColor。 (基于CGColorRef

对于NSPointNSRect,我会使用模型中的核心图形结构,并在需要时使用NSRectFromCGRectNSPointFromCGPoint进行转换。 (Mac OS 10.5 +)

最近的CIMGF文章还涉及iPhone / Mac不兼容性:
Creating a NSManagedObject that is Cross Platform

答案 1 :(得分:2)

我可能误解了您的设置和问题,但听起来您的数据模型不够抽象。

严格地说,“NSPoints / CGPoints,NSRect / CGRects,NSColor / UIColor和NSImage / UIImage结构/对象”都是与数据模型无关的实现/ UI元素。当然,API可以轻松归档这些内容,但这会让您陷入现在的问题。您正在保存附加到特定硬件和特定实现的对象/结构,现在您可以轻松地移植/重用它们。

更好的方法是创建一个抽象的数据模型,该模型对硬件或API的其余部分一无所知。它应该将所有NSPoints / CGPoints,NSRect / CGRects存储为字符串或数字。它应该将颜色存储为数字,字符串或原始数据。图像应存储为原始数据。

这样,应用程序的核心,即它实际操作的数据是通用的。要显示信息,您只需要控制器请求原始数据,然后让控制器将其转换为硬件/ API特定的结构/对象。

核心数据提供了抽象数据模型的一个很好的例子。它只存储字符串,数字,日期,布尔等,但它可以存储任何支持核心数据的平台的任意复杂信息。

即使您不使用Core Data,也就是您应该拍摄的数据模型类型。

答案 2 :(得分:1)

@“编写我自己的rect函数,根据arch调用相应的函数” - 这样会很好。

@“编写我自己的封装NSColor和UIColor的MNColor对象” - 如果您的包装类设计能够在跨平台情况下处理MNColor对象,那将是很好的。即,如果导入到iPhone的mac数据库现在应该能够通过你的包装器而不是NSColor以某种方式提供UIColor对象。

答案 3 :(得分:0)

这取决于您的使用情况,但我不鼓励将图像存储在数据库中。他们最好在文件系统上(可能)存储在数据库中的图像路径。

通过将图像存储在数据库中,我可以看到任何收益的一种情况是,如果您想要一个可以移动的文件系统单元,那么可以移动所有内容。虽然使用iPhone这不太可能是用例。