iOS/Cocoa - 数据模型 <-> 控制器的设计模式

2023-12-13

(我读过很多关于此的 stackoverflow 文章,以及一般的 Cocoa MVC,但大多数都与视图控制器之间的信息共享有关。)

鉴于以下情况:

  • 一个 DataModel 类,负责下载、解析、验证和存储(XML 或 JSON 派生的)数据,

  • 一个 ViewController 类,它将实例化单个 DataModel 对象,并且需要随着时间的推移从该 DataModel 获取信息(例如更新视图以反映模型中的更改)

问:处理模型数据更改通知以及将该数据提供给视图控制器的最佳实践是什么?

我见过的方法包括:

  • Model 类发布通知,并提供通知的 userInfo 字典中的数据。视图控制器监听通知,查看用户信息。例如Apple 的 SeismicXML 示例代码。

  • Model类定义了一个Protocol,View Controller作为委托,响应Model的具体协议方法。

  • Model类保存一个指向View Controller的指针,直接调用View Controller中的方法或属性。 (我必须说,我不喜欢这个,因为它需要模型和控制器之间的紧密绑定。)

我倾向于通知方法,但想听听其他人的意见。


我会不惜一切代价避免模型存储指向视图控制器的指针。这是正常责任的倒置。在 MVC 中,模型应该独立于任何控制器运行。

委托/协议模式非常适合在视图控制器生命周期内创建和销毁的短期模型。

通知和 KVO 是我处理底层模型更改的主要方式。它允许模型存活很长时间,并且独立于在其生命周期中创建和销毁的控制器而工作。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

iOS/Cocoa - 数据模型 <-> 控制器的设计模式 的相关文章

  • 在WKWebview中设置useragent

    如何在 WKWebView 中设置自定义用户代理字符串 我正在尝试嵌入我的应用程序的版本 以便我的服务器端可以看到可用的功能 我找到了以下方法 let userAgent MyApp 1 33 7 request setValue user
  • 空对象模式以避免空检查?

    最近 我遇到了空对象设计模式 我的同事说它可以用来消除整个代码中遇到的空指针检查 例如 假设 DAO 类返回有关 Customer 的信息 在名为 CustomerVO 的值对象中 我的主类应该提取名字和电子邮件 ID 并向客户发送电子邮件
  • 播放(非库)Apple Music 内容 - 请求失败

    我正在尝试使用以下代码播放专辑 let predicate MPMediaPropertyPredicate value 1459938538 forProperty MPMediaItemPropertyAlbumPersistentID
  • iOS 发送 iMessage 尽可能简单

    我希望能够以编程方式发送 iMessage 除了调用一个将文本发送到带有消息的号码的函数之外 无需执行任何其他操作 这两个消息都是文本框 我真的很感激一些示例代码 因为我在网上搜索过 但我发现没有任何帮助 这不适用于商业应用程序 仅适用于我
  • iOS 对 Google 云消息传递的支持

    我在谷歌的开发者控制台中看到 GCM 允许为 iOS 生成 API 密钥 我在网上搜索了有关如何在 iOS 应用程序中通过 GCM 实现推送通知的任何类型的文档 但没有找到答案 真的有可能在 iOS 应用程序中使用 GCM 实现推送通知 j
  • XCode 调试 - 我可以绕过反汇编代码的单步执行吗

    调试项目时 在 XCode 中设置断点后 我将开始单步执行代码 然后我会遇到反汇编代码 我认为这些代码是对没有可用源代码的各种框架的调用 这是一个正确的假设吗 有没有一种方法 可能通过我尚未找到的项目设置 来抑制此汇编代码的显示 而不必单步
  • 无边框 NSButton 单击时变为灰色

    我正在使用三个带有图像集的 NSButton 制作一个小应用程序 这些按钮没有边框也没有背景 但是 当我单击按钮时 它会变成灰色矩形 我怎样才能解决这个问题 谢谢 让你的按钮类型为NSMomentaryChangeButton myBtn
  • 删除部分(红色删除按钮),UITableViewController - iOS

    我正在尝试做一个分组的 uitableview 并且我已经激活了编辑选项 我希望用户也能够删除整个部分 而不仅仅是特定行 因此 当您单击 编辑 时 每个表格单元格左侧显示的红色减号按钮也应该显示在各个部分 部分标题左侧 有人知道如何做到这一
  • 监控剪贴板活动可可?

    是否可以在可可中 观看 用户剪贴板 例如 如果我的应用程序是系统托盘样式应用程序 例如 dropbox 客户端 我可以订阅用户在另一个应用程序中点击复制 粘贴时引发的事件吗 你可以随时查看Apple的示例代码 剪贴板查看器 http dev
  • Firebase Messaging FCM 在可配置的时间间隔内分发

    当您使用 FCM 向给定应用程序的所有设备发送推送时 这可能会导致许多用户同时打开他们的应用程序 从而导致大量服务器轮询 从而导致负载峰值 有没有一种方便的方法可以在给定的时间间隔内分发消息以进行计划推送 最后 我们找到了一种可能的方法 通
  • AVAssetExportSession 输出文件

    AVAssetExportSession 输出文件应该是什么样子 我正在尝试压缩 ALAsset 项目中的视频 但它不起作用 我猜输出文件与它有关 这是我正在使用的代码 NSString destinationPath NSHomeDire
  • NSPredicate 使用 RLMResults 作为参数

    我试图通过使用 NSPredicate 进行过滤来获取两组 Realm 数据 并且是不同的对象 之间的差异 但存在一个我无法理解的错误 我的代码 RLMResults topStories KFXTopStory allObjects NS
  • 在 Java 中创建 T 的新实例

    在C 中 我们可以定义一个泛型class A
  • 当 Firebase 函数以 Swift 结束时

    我在我的应用程序中使用 Firebase 它查询大量用户并获取所需的特定数据 但是当它开始查询时 其余功能也继续运行 而不仅仅是查询 所以我无法理解当它结束时 例如在这段代码中 ref observeEventType ChildAdded
  • ios - 使用 SIGPIPE 和 SIG_IGN 的信号函数

    我加入了一个旧项目 我发现了这条线 BOOL application UIApplication application didFinishLaunchingWithOptions NSDictionary launchOptions si
  • 如何确定 UINavigationController 中工具栏的高度?

    我有一个带有由 UINavigationController 呈现的工具栏的视图 当我处理 UIKeyboardWillShowNotification 时 我将整个屏幕向上滚动键盘的高度 问题是当显示键盘时 底部工具栏不显示 所以我只需将
  • swift 3.0 中的 Sha 256 加密语法错误

    func SHA256 gt String let data self data using String Encoding utf8 let res NSMutableData length Int CC SHA256 DIGEST LE
  • 可可:NSView原点x在底部

    我正在以编程方式创建一个NSWindow以及其上的控件 看来原点 0 0 位于左下角 这对我来说很奇怪 来自其他 GUI 工具包 是否有一些标志 以便我可以更改它 使原点位于左上角 在 OS X 上 原点位于左下角 对于屏幕坐标和视图框架来
  • Parse 在哪里存储用户会话

    登录代码 PFUser logInWithUsernameInBackground self userTextField text password self passwordTextField text block PFUser user
  • iOS SDK:MapKit MKPolyLine 未显示

    我试图在地图上显示多段线 但该线没有显示 我尝试了很多事情 但注意到似乎有用 我检查了核心数据函数 它正在返回数据 所以这不是问题 它必须是我在地图点创建或地图上绘制的某个地方 我猜 我确信一定是某个地方出了点小错误 但我找不到它 My c

随机推荐

  • 如何从json字符串中提取值?

    我有一个文件 其中有一堆列和一个名为jsonstring是字符串类型 其中包含 json 字符串 假设格式如下 key1 value1 key2 level2key1 level2value1 level2key2 level2value2
  • Java 大文件上传抛出 java.io.IOException: Map failed

    我正在使用 Spring 和 Hibernate 并尝试上传大文件 但是当我尝试上传时 超过 150 Mb 那么它会生成错误 例如 Caused by java lang OutOfMemoryError Map failed at sun
  • 在准备好的语句中重用匿名参数

    我正在自定义 hibernate 生成的插入 SQL 但遇到了问题 当 Hibernate 自己生成查询时 它会将数据插入表的前两列 但这会导致数据库错误 因为表的所有四列都是不可为空的 为了正确执行插入 必须将相同的数据插入到新记录的两列
  • 在 opencart 中添加“加”“减”代替“添加到购物车”

    我想用 OpenCart 2 0 1 1 中的 2 个加号和减号按钮替换添加到购物车 现在我无法正确编码减号按钮 我在中添加了加号和减号按钮catalog view theme template module featured tpl并拨打
  • C++ 图像处理库

    我需要一个可以检测图像中的对象的库 使用边缘检测 这与验证码无关 我正在开发一个使用 OCR 且可以在任何屏幕分辨率下工作的 MTGO 机器人 为了使其能够移植到任何屏幕分辨率 我的想法是扫描结果页面上的狭窄范围 玩家拥有的卡牌可以在文本行
  • 转换二维数组

    What is selectMany ToArray 方法 它是一个内置方法吗C 我需要将二维数组转换为一维数组 如果你的意思是jagged array T SelectMany是你的朋友 但是 如果您的意思是矩形的 array T 那么你
  • Android 浏览器上未引发 JavaScript 按键事件

    我创建了一个简单的代码来处理keypress event var counter 0 input on keypress function div text key pressed counter JSFiddle 但移动浏览器 Andro
  • 如何将 html 链接添加到图像标题

    我实际上需要在 longdesc 属性中包含 html 链接 我已经将 Prettyphoto 更改为使用 longdesc 而不是图像标题 但我需要在这些描述中包含 html 链接 我知道字符代码是可能的 我只是不记得那些是什么 Than
  • 如何使用 CMake 生成 Windows DLL 版本信息?

    这非常类似于 如何使用 CMake 生成 Windows DLL 版本控制信息 但我想我可能会再问一次 因为从那以后事情可能发生了变化 使用以下 CMakeLists txt 文件 https github com malaterre GD
  • AsyncTask 取消不起作用

    我正在学习如何取消 asyncTask 因此下面的代码没有用处 我尝试调用 asyncTask 并执行它 然后取消它并执行它 MyAsyncTask asyncTask new MyAsyncTask Log i cancel cancel
  • 使用 python 查找 HTML 代码中的特定注释

    我在 python 中找不到具体的注释 例如 我的主要原因是找到 2 个特定评论中的所有链接 像解析器之类的东西 我尝试过这个Beautifulsoup import urllib over urlopen www gamespot com
  • Java中如何比较int数组? [复制]

    这个问题在这里已经有答案了 当我尝试比较两个 int 数组时 即使它们完全相同 里面的代码if one two 仍然没有被执行 为什么是这样 Object one 1 2 3 4 5 6 7 8 9 Object two 1 2 3 4 5
  • 循环遍历集合中的 jQuery 对象,而不为每次迭代初始化新的 jQuery 对象

    我发现自己一直在这样做 myElements each function index currentHtmltmlElement var currentJqueryElement currentHtmltmlElement Working
  • 在 Lisp 中打印 defstruct

    我在 Lisp 中定义了一个非常简单的数据结构 Data structure for a person defstruct person name nil age 0 siblings nil type list Siblings is a
  • 寻找特定顶点最短路径的好算法

    我正在解决下面描述的问题 并且想不出比尝试每个组的每个顶点的每个排列更好的算法 我得到了一张顶点图 以及一组特定顶点组的列表 目标是找到从特定起始顶点到特定结束顶点的最短路径 并且该路径必须从每个顶点至少经过一个顶点指定的顶点组 图中还存在
  • 使用 python 请求登录 Facebook

    我正在尝试找到一种使用 Python 无需浏览器即可自动登录 Facebook 的方法 我尝试了 请求 库 尝试了几种方法 URL http m facebook com requests get URL auth email protec
  • 带有自定义图片的 Facebook API 帖子链接

    我可以为链接设置自定义图片和标题 现在v2 9已经不可能了 是否有某种不指定 og 标签的解决方法 使用 Facebook Graph v2 8 时 您可以发布链接并显示自定义图像 而不是 og image 这是通过将图片参数添加到挂钩来完
  • 如何在编译时提取没有路径和后缀的源文件名?

    同时使用带 std c11 的 gcc 和带 std c 14 的 g 例如 对于名为src dir Hello cxx它应该扩展到类似以下内容 const char basename Hello or const char basenam
  • C# 静态变量 - 范围和持久性

    我刚刚做了一个小实验 public abstract class MyClass private static int myInt 0 public static int Foo return myInt public static int
  • iOS/Cocoa - 数据模型 <-> 控制器的设计模式

    我读过很多关于此的 stackoverflow 文章 以及一般的 Cocoa MVC 但大多数都与视图控制器之间的信息共享有关 鉴于以下情况 一个 DataModel 类 负责下载 解析 验证和存储 XML 或 JSON 派生的 数据 一个