我正在从服务器中获取数据,例如- fetchData()
。
我想以这样的方式编写逻辑:如果 fetchData()
从不同的类调用了两次(一个接一个),那么一旦网络调用完成,两个类都应该得到通知。
我的fetchData()方法是基于块的。
基本上,我想实现以下目标- 如果正在进行n / w调用,则不应再次调用fetchDAta()来获取相同数据。
例如
fetchData()
方法用于在两个视图控制器(例如A和B)上显示数据。
如果用户在控制器A上,则将发起**fetchData()**
调用,并且如果在完成之前用户移至控制器B,该控制器B也调用fetchData()来显示数据。然后将再次进行网络呼叫或其他操作。
如果我们知道数据相同,那么有什么方法可以在对方法B的第一次调用完成之后将相同的数据传递给控制器B,而无需再次启动n / w调用?
如何为控制器A和B调用完成处理程序?
答案 0 :(得分:1)
1-由于存在多个通知,因此最好使用NSNotificationCenter
向所有侦听器发送数据就绪消息,关于数据本身,您可以在使用object或userInfo发布通知时将其发送通知中心或单独共享
2-无需NotificationCenter,需要数据的人应注册为观察员
答案 1 :(得分:0)
假设您的fetchData
在单例类中,则一种方法是在单例类中使用delegates
直接将更改通知给他们。添加A类和B类作为代理。
protocol FetchDataProtocol {
func didfinishDownloadingData()
}
class SingletonClass {
private var observers: [FetchDataProtocol] = []
func add(observer: FetchDataProtocol) {
if observers.index(where: { $0 === observer }) == nil {
observers.append(observer)
}
}
func remove(observer: FetchDataProtocol) {
//find the object from observers then remove
}
private func notifyAll() {
observers.forEach{ observer in
observer.didfinishDownloadingData()
}
}
public function fetchData(){
//When finished
self.notifyAll()
}
}
将您的班级作为观察员添加到fetchData
更改中。
// Do the same for ClassB
ClassA: FetchDataProtocol {
init() {
SingletonClass.shared.add(self)
}
func didfinishDownloadingData() {
//notified here
}
deinit() {
SingletonClass.shared.remove(self)
}
}