我正在考虑统一我的应用程序模型。目前我在mac / iphone上使用了不同的型号。缺少类(NSAttributedString)和缺少技术(Bindings)使我决定采用这个决定。
随着SDK 3.2中的第一个限制以及我计划创建优化的iPad版本,我正在重新考虑我的决定。因为我还需要在我的模型中存储NSPoints / CGPoints,NSRect / CGRects,NSColor / UIColor和NSImage / UIImage结构/对象,所以我不确定处理它们的最佳方法是什么。
编写我自己的MNColor对象,根据架构封装NSColor和UIColor? 编写我自己的rect函数,根据arch调用相应的函数?或者在Mac上的模型中使用CGRect?
非常感谢任何输入!
答案 0 :(得分:2)
CorePlot是适用于iPhone和Mac OS X的优秀Cocoa绘图框架 它在两个平台上共享通用代码 - 也许您可以通过浏览their source获得一些想法。
对于某些跨平台问题,CP在单独的头文件中使用特定于平台的定义来获得“不可知”的图像类。
每个平台的Xcode项目包括一个相应的标题:
他们还有自定义颜色类CPColor。 (基于CGColorRef
)
对于NSPoint
和NSRect
,我会使用模型中的核心图形结构,并在需要时使用NSRectFromCGRect和NSPointFromCGPoint进行转换。 (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这不太可能是用例。