在优步的移动生态系统中,我们一直在努力设计我们的架构以实现重用。我们从适当的模块化代码中获益良多,因为我们不断地进行实验,帮助我们在不同的市场和我们服务的人群中做出产品决策。在过去的一年里,我们迭代地工作ohana,用于检索和格式化联系信息的IOS框架,我们开放了它其他人可以在此基础上继续发展。
Ohana(夏威夷语中的family)提供了一些工具,可以方便地组织和显示iOS地址簿中的联系人信息。它是一个数据工具集,而不是一个UI小部件。Ohana是一项更广泛的努力的一部分,旨在模块化逻辑和UI,向用户展示iOS应用程序的联系人。下面是更多关于Ohana的内容,以及它如何成为iOS应用程序架构中有用的一部分。我们将概述Ohana及其组件的功能,并提供一些源代码接口,以便您在应用程序中使用它。
建筑学
Ohana的高级架构是关于从多个源(抽象到数据提供商)的数据过滤数据,通过订购的一组后处理器来转换特定用户需要的数据,例如在应用程序中显示它:
Ohana用途Ubersignals.(实施)可观察模式)作为其主要数据流机修工。OHANA具有一小部分可实现的协议(DataProvider,PostProcessor,选择官方)允许消费应用程序自定义其行为。我们订购了其组件的解释,按优先顺序进行了重要性,以便如何使用Ohana。
OHContact.
这是联系人的数据模型,并且是系统的输出:最终结果。OHContact包含像最常见的名称和姓氏的字段属性,这些字段在大多数联系人以及列表中OHContactFields对于“iPhone”或“传真”等任意命名的字段:
@Interface ohContact:nsobject
@property (nonatomic, nullable) NSString *firstName;
@property (nonatomic, nullable) NSString *lastName;
@property(非atomic,nullable)nsorderedset
//省略属性
- (BOOL)areoqualtocontact :( ohcontact *)联系;
@结尾
OHCONTACTSDATASOURCE.
数据源是检索联系人的地方。这是一个Cocoa意义上的数据源;这是将最终联系人数据提供给您的应用程序。数据源是包含Ohana内部实现的核心的类。它触发了通过数据提供程序的联系加载,并使用后处理器配置其数据。一旦联系人被加载和处理,就会OnContActSdatasourcereAdaSignal.被解雇了联系人列表已填充。框架的消费者将此自定义数据提供程序和后处理器插入此对象以配置Ohana以供其用例:
@interface OHContactsDataSource: NSObject
@property(非atomic,readonly)ohcontactsdatasourcereadysignal * on on anyactsdatasourcereavyalignal;
@property (nonatomic, readonly, nullable) NSOrderedSet
- (instancetype)initWithDataProviders:(NSOrderedSet
- (空白)LoadContacts;
//省略属性
@结尾
OHCONTACTSDATAProviderProtocol.
数据提供者协议描述了从您选择的源检索联系信息的界面。OHANA提供默认实现,以通过通过iOS的地址簿使用abaddressbook.或者cnContacts.API。您可以同时使用多个数据提供程序。例如,你可以实现自己的数据提供程序,它从Facebook检索联系人,并将他们与系统联系人交织在一起:
@protocol ohcontactsdataproviderprotocol
@property (nonatomic, readonly) ohcontactsdataproviderfinishhedloadingsignal * oncontactsdataproviderfinishhedloadingsignal;
@property (nonatomic, readonly, nullable) NSOrderedSet
- (空白)LoadContacts;
//省略属性
@结尾
OHContactsPostProcessorProtocol
Post Process协议描述了一个用于过滤要向消费者公开的数据的接口。后置处理器可以只过滤有关联电话号码的联系人,或重新排序输入联系人以字母顺序显示。然后你可以把这些后处理器连接起来数据反映了两种转换。这些和许多其他有用的后处理器默认情况下在Ohana中提供。
当消费者实现自己的后处理器以获得自定义需求时,系统的实际力量出现。您是否希望过滤有某个区号的联系人?共享地址的Dedupe联系人?确保您只显示您碰巧关心的所有字段的联系人?所有这些用例都适用于API。(一旦你建造了他们,考虑提出拉索!)
@protocol ohcontactspostprocessorprotocol
- (nsorderedset
@结尾
下面是一个过滤的例子,如果你有以下数据集……
{“首先”:“Marge”,“最后”:“SIMPSON”,“Image”:
{“第一”:“妈妈”,“最后一次”:nil,“图像”:<界面图像>}
{“第一”:“星期三”,“最后”:“addams”,“图像”:
{“首先”:“荷马”,“最后”:“辛普森”,“图像”:
{“第一”:“麦琪”、“最后”:“辛普森”、“图像”:nil}
{“首先”:“鼠标”,“最后”:“addams”,“图像”:
{“第一”:“戈麦斯”,“最后”:“addams”,“图像”:
{“第一”:“BAE”,“最后”:nil,“图像”:nil}
…并想要过滤完整的数据,并改变数据以不同的格式发送到服务器,如以下:
{“full_name”:“morticia addams”,“图像”:
{" full_name ": " Gomez adams ", " image ":
{“full_name”:“周三addams”,“图像”:
{“full_name”:“homer simpson”,“image”:
{“full_name”:“marge simpson”,“图像”:
您可以使用三个后处理器执行以下步骤:
- 过滤器的联系人与数据的所有数据进行过滤器:'第一的'那“最后一次”, 和'图像'字段。(OHSplitOnFieldTypePostProcessor)
- 订购联系人“最后一次”, 然后'第一的'(ohalphabetysortpostpostprocessor.)
- 将“第一”和“最后”字段合并到a中'全名'字段(自定义后处理器实现)
OHCONTACTSSELECTIONFILTERPROTOCL.
由于UI中的选择和取消选择联系人是一个非常常见的用例,因此Ohana提供了用于满足过滤选择的第一类支持并在发生时通知。例如,联系人选择器可能只允许在任何时间选择三个触点(OhmaximulSelectedCountSelectionFilter.),并且可能希望在用户尝试选择第四触点时显示清晰的错误状态和取消选择。
我们不会在这里进一步描述这个API,但在我们的开源文档中有一些示例实现了解更多有关Ohana Works如何选择的联系选择。
使用Ohana作为项目的一部分
将Ohana设置为iOS系统地址本的简单用户是很容易的。这段来自ViewController的代码片段为系统地址簿实例化了一个数据提供程序和一个Post处理器来按联系人的全名排序:
让字母表中的processor = OhalphabetySortPostPostProcessor(SortMode:.fulllname)
var dataprovider = OhabAddressBookContactsDataProvider(委托:self)
让DataSource = OhContactsDataSource(DataProviders:nsOrderedSet(对象:DataProvider),后处理器:NSOrderedSet(对象:AlphabetySortProcessor))
最后,指明返回联系人时要触发哪个代码,并调用它来加载它们:
datasource.oncontactsdatasourcereadysignal.addobserver(self,callback:{[弱自我](观察者)
自我?.tableview?.reloaddata()
//表视图从DataSource.Contacts读取联系人
})
DataSource.LoadContacts()
对于一个基本的contact picker视图,就是这样。剩下的就是把你的OHCONTACTSDATASOURCE.作为表视图的数据源。
Ohana包括一个具有大的示例应用程序一套例子在Swift和Objective-c。示例应用程序显示如何进行更复杂的转换,以及Ohana如何无缝地处理验证挑战等异步问题。
在优步上使用Ohana
制作Ohana的努力始于驱动程序注册团队,其使命是通过驱动程序应用程序增加合作伙伴注册。我们发现了组件化并且在代码中仔细分离问题对于允许我们在做出快速实验的同时维护Codebase质量至关重要。
一旦妥善组成,我们的联系人致电逻辑就会足够了工程师想使用它。负责联系我们应用程序的其他部分联系人的团队(例如,票价分裂,分享我的ETA,邀请)快速巩固使用相同的架构。我们创建的联系人数据模型成为与应用程序的每层的联系人信息交互的事实格式。
我们已经自从以来开放的奥纳纳。优步拥有灵活的开源策略。这代码版本必须是开源社区普遍感兴趣的,而且我们必须能够授权它,使它能够对其他人有用。重要的是,开放源码项目还应该有一组清晰的所有者,当开放源码社区参与进来时,以及当项目周围的技术环境发生变化时,他们可以承诺处理项目的生命周期。
自开放ohana以来,我们为管理依赖项添加了支持迦太基,添加功能,并修复了Swift 3支持中的一些错误。
让iOS的联系人比核心api更容易访问,可以让你更有创意地控制如何在应用程序中显示联系人。如果你的需求超出了显示联系人,这将对处理项目中的联系人非常有用默认IOS联系选择器。看一看ohana,看看它是否符合您的项目需求。我们欢迎推拉请求,我们在Uber Engineering愿意看到更广泛的IOS社区给工具尝试。






