iOS设计模式|辛格尔顿

时间:2018-07-16 23:01:56

标签: swift block cocoa-design-patterns

我正在从服务器中获取数据,例如- fetchData()

我想以这样的方式编写逻辑:如果 fetchData() 从不同的类调用了两次(一个接一个),那么一旦网络调用完成,两个类都应该得到通知。 我的fetchData()方法是基于块的。

基本上,我想实现以下目标- 如果正在进行n / w调用,则不应再次调用fetchDAta()来获取相同数据。

例如

fetchData() 方法用于在两个视图控制器(例如A和B)上显示数据。

如果用户在控制器A上,则将发起**fetchData()**调用,并且如果在完成之前用户移至控制器B,该控制器B也调用fetchData()来显示数据。然后将再次进行网络呼叫或其他操作。

如果我们知道数据相同,那么有什么方法可以在对方法B的第一次调用完成之后将相同的数据传递给控制器​​B,而无需再次启动n / w调用?

如何为控制器A和B调用完成处理程序?

2 个答案:

答案 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)
  }
}