问题标签 [cocoa-design-patterns]

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 投票
4 回答
794 浏览

objective-c - MVC 模式:格式化/处理类型工作属于哪里?(目标-C)

随着我的 Cocoa 技能逐渐提高,我尽量不滥用 MVC,因为我发现自己回到了我之前的假设所建​​立的一个洞中。我这里没有人可以解决这个问题,所以希望你们中的一个可以帮助...

我有一个自定义模型类,它有许多不同的属性(NSString、NSDate、NSNumber 等)。我需要序列化传输的属性。有时,在处理此数据以进行序列化时,可能会出现用户需要回答的问题(UIAlertView 等)

无需陷入太多细节,这段代码属于哪里?

  • 我的一部分说模型,因为它是关于数据的持久性 - 在某种程度上。
  • 我的一部分说View是因为它是对模型中包含的核心数据(没有双关语)的另一种解释。在处理数据时,用户有时必须与对话框进行交互
  • 我的一部分说控制器,因为它管理模型和视图之间的数据转换。

是三者的结合吗?如果是这样,在处理数据时如何处理类之间的通信?NS通知?直接方法调用?

0 投票
1 回答
1464 浏览

cocoa - 多窗口/NIB 可可应用程序的问题

我的 Cocoa 应用程序有问题。我正在使用我的应用程序委托作为控制器,并在 NIB 文件中打开一个窗口。单击工具栏按钮会从另一个 NIB 中打开另一个窗口。单击第二个窗口上的保存会调用应用程序委托/控制器上的方法。这一切都很好。

奇怪的是,我不知道当我单击工具栏按钮时应用程序委托指向一个内存位置,在第二个窗口上单击保存后指向另一个内存位置。就好像正在创建第二个应用程序委托/控制器,尽管单步执行代码并没有给我任何迹象表明这种情况正在发生。

有没有更好的方法来构建这种类型的应用程序?知道我要去哪里错了吗?

0 投票
6 回答
5300 浏览

iphone - 核心数据模式:如何通过网络更改有效地更新本地信息?

我想了解和修复我的应用程序效率低下。

我的算法是:

我正在通过使用属于我的模式的相关对象的键创建谓词查询来检查 A 和 B 行。我看到 A(总是)和 B(如果执行分支到该部分)都会生成一个 SQL 选择,例如:

0.0071s 的查询在 3GS 设备上是可以的,但如果你将其中的 100 个加起来,你就会得到一个 700ms 的拦截器。

在我的代码中,我使用了一个助手来进行这些获取:

我觉得这是错误的,我应该以其他方式进行检查。它应该只访问数据库一次,然后应该从内存中获取,对吗?(即使对于我确定在本地存在并且应该已经通过以前的查询加载到内存中的对象,SQL 也会执行。)但是,如果我只有来自外部源的 myObjectId,这是我能想到的最好的。

所以,也许问题是:如果我有 myObjectId(MyObject 上的 Core Data int64 属性),我应该如何正确检查 CD 存储中是否存在相关的本地对象?预加载整组可能的匹配,然后断言一个本地数组?

(一种可能的解决方案是将其移至后台线程。这很好,除了当我从线程获取更改并执行 [moc mergeChangesFromContextDidSaveNotification:aNotification]; (通过通知从后台线程获取更改的对象)时,这仍然阻塞。)

0 投票
1 回答
183 浏览

iphone - 在 Cocoa 中的两个控制器之间同步一个对象

我有一个 MainController,它创建一个对象(比如多边形)、一个控制器(比如 polygonViewController)。PolygonViewController 有两个出口:

它调解 Polygon 和 PolygonViewController.xib 文件。

如何确保 PolygonViewController 的 aPolygon 与 mainController 中创建的多边形相同(实例)?

我尝试添加@property Polygon* aPolygon;到 PolygonViewController 然后在 MainController 我做了polygonViewController.aPolygon = polygon;但是,PolygonViewController awakeFromNib 方法中的 aPolygon 始终为空。

0 投票
3 回答
1507 浏览

iphone - Objective C - objectForKey 的问题

好的,我正在尝试为我的应用程序编写一个高分函数。

我的问题是,当还没有保存高分时,我的程序崩溃了。

如果我保存它:

首先,它工作正常。但是,如果我第一次启动程序并尝试使用以下代码查看高分:

坏事发生。

基本上,是否可以查看在 firstName 下是否还存在任何内容?有没有办法在不删除任何可能已经存在的名称的情况下进行初始化?

谢谢。

0 投票
2 回答
2349 浏览

objective-c - “仅数据”Objective-C 对象的更好选择?

我经常遇到这样的设计选择并且有点挣扎;我正在寻找其他一些观点。

我经常想要保留列表或传递基本上只是一组值的状态块。这些值往往是原始类型:浮点数、NSTimeIntervals、CGPoints 等。

我的第一个倾向通常是为这些属性集创建 C 结构,例如

等等

但是 C 结构不能很好地与本机 Cocoa 集合类 ( NSArray, NSSet, NSDictionary) 配合使用,并且使用它们中的过多来跟踪大量状态感觉就像它与我的 Cocoa 友好代码的其余部分背道而驰——我最终拥有并直接管理结构数组,并在消息中传递结构指针等。

另一方面,由于原始性能不一定很重要,我可以将这些值编码到一个 NSDictionary 中,将它们全部包装在NSValueor中NSNumber,但生成的语法几乎不简洁,而且有点脆弱,需要在运行时类型和名称正确性插入和查找:

并且某些类型,例如 NSTimeInterval,只能与某些(有争议的)hackery 一起使用(在这种情况下类型转换为加倍)。

最后,我可以使用私有成员数据和只有 getter/setter 来创建纯数据容器对象。(这些在 Java 中被称为“bean”。)它们比字典更简洁,Cocoa 比结构更多,但对我来说感觉有点矫枉过正,尤其是当我只需要它们作为用于状态管理的“内部类”时单个对象类型的内部。

你,伟大的 Cocoa 编程公众,是怎么做到的?

0 投票
2 回答
1032 浏览

cocoa - 基于 Cocoa 文档的应用程序中的 MVC

我目前正在对我的应用程序进行重构和重组。我已经意识到模型和视图之间的一些分离,以及它们的控制器已经减少,我希望做一些清理工作。

我的应用程序中使用了几个关键类:NSPersistentDocument、NSWindowController 和一个模型类。

NSPersistentDocument 类充当“模型控制器”;它拥有模型类的一个实例,并管理与模型的所有交互。

NSWindowController 类充当“视图控制器”;它拥有主窗口,并管理主窗口中视图的交互。此类也是定义 Window 的 nib 文件的文件所有者。

我在这里看到的问题是我没有真正的“控制器”。我目前的设计迫使模型控制器和视图控制器相互了解。两者之间没有冥想对象,因此,我的模型和视图没有明确分离,这使得支持多个视图或模型成为一个问题。

我想将两个现有控制器的功能移动到一个新的“控制器”类中,该类将充当模型控制器和视图控制器之间的控制器。最后,这仍然只是 MVC 设计模式,只是多了一点结构。

但是,我很难弄清楚这将如何适应 Cocoa 的基于文档的应用程序架构。

我最大的问题是在哪里以及如何创建这个新的控制器对象?这如何适应 Cocoa 的架构?我是否在与 Cocoa 的架构作斗争,有没有更好的方法来做到这一点?

谢谢。

0 投票
2 回答
1018 浏览

iphone - iphone全局设置——最好的实现方式?

我想要一些可以从我的应用程序中的任何位置访问的设置。有没有最好的方法来实现这个?现在我只是在我的应用程序委托中粘贴属性,然后通过以下方式访问它们:

0 投票
4 回答
553 浏览

objective-c - 这是一个好的(类似可可,苹果认可的)模型类吗?

我使用 Objective-C 已经有一段时间了,但我并没有很好地遵循 Apple 的指导方针。最近我阅读了Cocoa Design PatternsModel Object Implementation Guide,我正在尝试做一些非常简单的事情,但做得很好。

我错过了任何主要概念吗?请不要提及self = [super init];这已经在 SO 上讨论过很多次了。随意批评我#pragma mark的虽然!

(编辑:到目前为止,我已经做出了建议的更改并评论了哪些答案讨论了它们,以防有人需要知道原因。)

0 投票
1 回答
282 浏览

iphone - 在 Cocoa 中实例化模型对象的层次结构时如何减少内存占用?

我正在为 iPhone 编写一个测验应用程序,使用基本NSObject子类来表示模型。在运行时,各种控制器实例化模型类并使用从磁盘上的 plist 读取的数据填充它们。

模型类代表多项选择测验的基本层次结构:

  • 一个应用程序有许多测验
  • 一个测验有很多问题
  • 一个问题有很多答案

目前,当QuizController类加载它的Quiz对象时,它会用实例填充它的questions NSArray属性Question,并且随着每个Question实例的初始化,它们每个都会初始化它们自己NSArrayAnswer实例。

我认识到,当我加载测验时,我不需要内存中的每个问题,我只需要Quiz实例questions数组中某个索引处的问题。

我认为某种数据源协议或延迟加载模式将有助于减少在该系统上加载任何特定测验时产生的内存占用,但我不确定如何实现。我非常感谢社区在以下方面提出的任何建议:

什么模式适合在这里使用?一个简短的代码片段对我理解如何开始实现它也很有帮助。