ios - 预加载网络数据时的 NSNotification 或 Delegate

标签 ios design-patterns delegates nsnotification

所以我最近遇到了一个问题,我还没有完全弄清楚如何解决。我的应用程序按以下方式设置:

  • 两个 View ,A 和 B(它们不是父/子)
  • 一个引擎类(做一些数据操作)
  • 网络层类
  • 数据库

View 创建一个引擎并将自己设置为委托(delegate)。引擎创建请求并将其传递给网络类,然后网络类通过委托(delegate)向引擎类报告。引擎做它需要做的任何事情,将其存储在数据库中,然后通过委托(delegate)通知 View 。

这一切都很好,花花公子,不需要单例,一切都很棒。但是,问题是对 View B 的网络调用需要一些时间。我想在用户仍在 View A 上时调用它。由于每个 View 都保留它自己的引擎实例,我可以从 View A 调用网络,但 View B 上的引擎实例不会知道

在这种情况下,我在想一旦处理完网络调用,引擎类就可以发送 NSNotification。这样即使有两个不同的引擎实例,View 也会收到通知。我很想使用单例,但我们的架构师非常讨厌他们。

最佳答案

我不知道我是否理解,但看起来你可以像你说的那样使用 NotificationCenter 进行这种通信

因此,在您的 View 类中,您可以添加一个通知观察器,它将调用您 View 的某些方法,例如更新 UI:(在 swift 4 中)

let nc = NotificationCenter.default

nc.addObserver(self,
               selector: #selector(updateViewMethod),
               name: NSNotification.Name(rawValue: "someName"),
               object: nil)

在您的引擎类中,当您收到请求的响应时,您可以发布与 View 类中相同名称的通知,如有必要,您可以在 userInfo 字典中传递任何数据:

let nc = NotificationCenter.default

nc.post(name: NSNotification.Name(rawValue: "someName"),
        object: nil,
        userInfo: [“some_key”:”any_value_(any value)”])

就像你说的, View 类的任何实例都会调用“updateViewMethod”方法,如果你想发送单独的通知,你必须在为A和B实例化 View 和引擎时指定通知的名称,例如,在您的 View 和引擎类中,您可以创建一个名为“notificationName”的变量,并为 A 和 B 实例设置不同的值,这样您的 View 类通知应该是这样的:

let nc = NotificationCenter.default

nc.addObserver(self,
               selector: #selector(updateViewMethod),
               name: NSNotification.Name(rawValue: notificationName),
               object: nil) 

和引擎:

let nc = NotificationCenter.default

nc.post(name: NSNotification.Name(rawValue: notificationName),
        object: nil,
        userInfo: [“some_key”:”any_value_(any value)”])

希望在某种程度上有所帮助。

关于ios - 预加载网络数据时的 NSNotification 或 Delegate,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47186254/

相关文章:

multithreading - 在执行之前检查异步任务依赖关系的设计模式

c# - 编译器歧义调用错误-具有Func <>或Action的匿名方法和方法组

c# - 如何使用可变数量的参数创建对目标的委托(delegate)

ios - Google places api 应该只返回地址

ios - 动态 ScrollView

ios - 将光标放在 UITest 下 UITextView 的末尾

javascript - 关于 jQuery 模式的问题

ios - Xamarin iOS Storyboard, subview 半宽然后是父 View 。看法

design-patterns - 惯用的元编程

ios - 我应该为远程应用程序使用哪种观察者模式?