所以我最近遇到了一个问题,我还没有完全弄清楚如何解决。我的应用程序按以下方式设置:
- 两个 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/