我正在用一种方法从服务器获取数据,例如:fetchData()
。
我想以这样一种方式编写逻辑,即如果fetchData()
从不同的类调用两次(一个接一个(,那么一旦网络调用完成,就应该通知这两个类。我的fetchData((方法是基于块的。
基本上,我想实现以下目标-如果n/w调用正在进行,那么另一个对fetchDAta((的调用不应该启动n/w调用来获取相同的数据。
例如
fetchData()
方法用于在双视图控制器Eg A和B上显示数据。
如果用户在控制器A上,则**fetchData()**
调用将被启动,如果在完成之前用户移动到控制器B,控制器B也调用fetchData((来显示数据。然后将再次进行网络呼叫或其他操作。
如果我们知道数据是相同的,有没有任何方法可以在对该方法的第一次调用完成后将相同的数据传递给控制器B,而无需再次启动n/w调用?
如何为控制器A和B调用完成处理程序?
1-由于有一个多个通知,因此最好使用NSNotificationCenter
向所有侦听器发送数据就绪消息,关于数据本身,您可以在使用通知中心的object或userInfo发布通知时发送它,也可以在单例中共享它
2-由于NotificationCenter不需要,需要数据的人应该注册为观察员
假设您的fetchData
在singleton类中,一种方法是在singleton类别中使用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)
}
}