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

时间:2017-11-08 17:39:50

标签: ios design-patterns delegates nsnotification

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

  • 两个观点,A和B(他们不是父/子)
  • 一个引擎类(执行一些数据操作)
  • 网络层类
  • DB

视图创建引擎并将自身设置为委托。引擎创建请求并将其传递给网络类,然后通过委托向引擎类报告。引擎执行它需要做的任何事情,将其存储在DB中,然后通过委托通知视图。

这一切都很好,花花公子,不需要单身,一切都很棒。但是,问题是对View B的网络调用需要一些时间。当用户仍然在View A上时,我想调用它。因为每个视图都保留了它自己的引擎实例,所以我可以从View A调用网络,但引擎实例视图B不会意识到它。

我想在这个例子中,一旦网络调用被处理,引擎类就可以发送NSNotification。这种方式即使有两个不同的引擎实例,View也会收到通知。我喜欢使用单身人士,但我们的建筑师热情地讨厌他们。

1 个答案:

答案 0 :(得分:1)

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

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

let nc = NotificationCenter.default

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

在您的引擎类中,当您收到请求的响应时,您可以使用与视图类相同的名称发布通知,如果需要,您可以在userInfo字典上传递任何数据:

let nc = NotificationCenter.default

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

就像你说的那样,视图类的任何实例都会调用“updateViewMethod”方法,如果你想发送单独的通知,你必须在实例化A和B的视图和引擎时指定通知的名称,例如,在您的视图和引擎类中,您可以创建一个名为“notificationName”的变量,并为A和B实例添加不同的值,因此您可以查看类通知:

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)”])

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