我想知道为什么Apple允许创建多个HMHomeManager实例,它的目的是什么?
我希望 HMHomeManager 的实例是一个单例。
我不能代表苹果,但我认为没有任何情况HMHomeManager
会从单身中受益,并且有几个明显的缺点。
HMHomeManager
有财产delegate
。当您希望委托人向单个委托人发送消息或多个委托人可能共享一个委托人时,委托人模式很有效。然而,当一个委托人可能会产生许多委托人感兴趣的消息时,如果HMHomeManager
是单例,情况就会如此。HMHomeManager
作为单例的应用程序都会将该对象保留在内存中,以监控主数据库的更改,即使不再需要它。HMHomeManager
可能不会永远成立。虽然一个HMHomeManager
可以包含许多房屋,但它们都共享一个共同的用户。将此类设计为单例将阻止应用程序同时代表多个用户执行操作。即使永远不需要这种行为,开发人员也可能明智地避免在设计过程的早期选择不能支持它的接口。不要创建 HMHomeManager 的多个实例。下面的代码可能会有所帮助。如果您想对现有房屋进行任何更改,请尝试在进行添加房间、区域等更改后执行代码...
for(HMHome *home in appDelegate.homeManager.homes)
{
if([home.name isEqualToString:appDel.selectedHome.name])
{
appDel.selectedHome = home;
}
}
我希望内部有一个单例客户端与 home 守护进程通信,同样的方式CLLocationManager
有一个单例CLLocationInternalClient.sharedServiceClient
,它允许我们在整个应用程序中分散位置管理器,而不必担心在我们周围转发通知或多播委托方法。我没有仔细研究HMHomeManager
过,它看起来确实是一个匆忙的 API,所以可能设计得不太好。这与文档中提到的“您的应用程序的经理”有关,就好像我们只应该有一个一样。此外,当您收到 home 更改委托调用时,它会告诉我们“使您自己的应用程序缓存 home 数据的对象无效”。我注意到的一件事是当你初始化一个HMHomeManager
它为我的 301 个特征、68 个服务、19 个附件主页(我在 Instruments 中使用 Allocations 搜索“ HM'来学习这个)。所以我们可能应该坚持每个应用程序只有一个管理器,但是 API 存在一个严重的设计问题,当我们切换一个特性时,委托方法不会被调用,所以我们需要联系我们应用程序的对象并使其无效而不是它发生像任何其他 API 一样自动为我们服务。