iOS 设计模式 |辛格尔顿
Posted
技术标签:
【中文标题】iOS 设计模式 |辛格尔顿【英文标题】:iOS Design Patterns | Singleton 【发布时间】:2018-07-16 23:01:56 【问题描述】:我正在以例如 fetchData()
的方法从服务器获取数据。
我想以这样的方式编写逻辑,如果 fetchData()
从不同的类调用两次(一个接一个),一旦网络调用完成,两个类都应该得到通知。
我的 fetchData() 方法是基于块的。
基本上,我想实现以下目标- 如果正在进行 n/w 调用,则对 fetchDAta() 的另一个调用不应启动 n/w 调用以获取相同的数据。
举例
fetchData()
方法用于在两个视图控制器(例如 A 和 B)上显示数据。
如果用户在控制器 A 上,则将启动 **fetchData()**
调用,如果在完成之前用户移动到控制器 B,控制器 B 也调用 fetchData() 来显示数据。然后再次进行网络调用或其他操作。
如果我们知道数据是相同的,有什么方法可以在第一次调用该方法完成后将相同的数据传递给控制器 B,而无需再次启动 n/w 调用?
如何为控制器 A 和 B 调用完成处理程序?
【问题讨论】:
【参考方案1】:1- 由于存在一对多通知,那么最好使用NSNotificationCenter
向所有侦听器发送数据就绪消息,关于数据本身,您可以在使用 object 或 userInfo 发布通知时发送它通知中心或单例共享
2- 有了 NotificationCenter 就不需要了,需要数据的人应该注册为观察者
【讨论】:
【参考方案2】:假设您的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)
【讨论】:
@janusbalabat,你为什么要在数组中添加观察者?我们不能在这里使用简单的委托模式吗?虽然请求可以来自多个控制器,但一次只有一个控制器会在内存中。我们可以通过将委托设置为 nil 来使用这种单一方法,哪个视图会消失。在每个 viewController 的 viewDidDisapperar 中将委托设置为 nil?并在 viewWillApperar() 中再次获取单例的引用并设置委托?以上是关于iOS 设计模式 |辛格尔顿的主要内容,如果未能解决你的问题,请参考以下文章
Google AK47 的设计者 阿米特 辛格(Amit Singhal)博士如何评价机器学习?