设计iOS社交网络应用架构

最近,我发布了名为Socium的iOS社交网络应用模板。 在这里,我想与您分享我从开发中学到的知识。

功能清单

首先,我们需要写下要在应用程序中看到的功能列表。 例如,Socium与典型的社交网络应用程序一样,具有以下功能:

  • 用户资料
  • 用户帖子和评论
  • 发表喜欢
  • 浏览和搜索其他用户
  • 私人实时聊天
  • 追随者/追随者
  • 推送通知

考虑到此列表,我们可以为项目选择一个后端。

后端

社交网络应用程序是一个复杂的系统,由客户端和服务器端组成。 Socium的服务器端建立在Parse Server之上。 Parse Server有许多优点:它是开源的,具有庞大的社区,并且具有出色的iOS SDK(顺便说一下,还有Android SDK)。 Parse Server需要VPS或Heroku之类的云应用程序平台,对于不熟悉后端内容的用户而言,可能难以设置和维护。 但是,我相信控制后端是一件好事。 即使需要一些其他技能。 毕竟,我从课程中学习。

数据库架构

现在,当我们知道要求时,就该写下所有必要的表及其之间的关系了。 这是我为Socium设计的架构:

让我们来看几个最有趣的实体(或Parse Server术语中的“类”)。

用户 / UserProfile 。 为了保护用户的电子邮件,我为公共用户配置文件创建了另一个类UserProfile,并与User类添加了一对一的关系。 任何人都可以看到UserProfile用户仅对所有者和管理员可见。

UserProfile具有followingsfollowerspostLikes字段,它们分别是与UserProfilePost实体的一对多关系。 他们全部

图片 。 我没有将图像直接存储在PFFile字段中,而是为此创建了一个单独的类。 因此,图像可以阵列和多对多关系存储。 如果我们想在照片中添加喜欢/不喜欢的功能,则可以提供更好的灵活性。

PostPostCommentConversationMessage实体非常不言自明。

客户端应用架构

定义数据库架构后,该考虑一下我们的iOS应用了。 该应用程序必须:

  • 快速有效地显示内容。
  • 与用户互动。
  • 向服务器发送请求并从服务器接收响应。
  • 可测试且可维护。

苹果公司的标准MVC设计模式不适用于如此庞大的项目。 VIPER看起来好多了。 但是,VIPER的准入门槛很高。 由于Socium是为广泛的开发人员(甚至是非开发人员)创建的iOS应用模板,因此可能很难为某人理解该项目。

最后,我决定将MVC方法与面向服务的体系结构相结合:所有业务逻辑都存储在Services中 ,该服务ViewControllers分开。 因此,视图控制器从不直接与后端交互。 相反,它要求适当的服务来执行所需的操作。 服务与后端交互,使用模型并处理CRUD(创建,读取,更新,删除)操作。 每个模型( PostUserProfileMessage )都有一个适当的服务( PostServiceUserProfileServiceMessageService )。

值得注意的是,模型不是PFObject的子类,因为将来我们可能希望连接另一个后端(不是Parse Server)。 这就是为什么服务还需要将对象解析为我们的模型,反之亦然。 为了保持单一责任原则,我将解析逻辑分为解析器。

架构如下所示:

请注意,应用程序将检索到的对象存储在缓存中。 每个服务都有自己的缓存。 最初,我正在考虑将对象存储在服务中的纯数组中。 但是,如果高速缓存具有诸如appendEntityIfNeeded,appendEntitiesIfNeeded,removeEntity之类的方法,则将很有用。所有这些方法都可以(并且应该)分成另一个类,该类充当高速缓存。 我没有设置实现数据持久性的要求,因此没有使用Core Data。 一旦应用程序关闭,缓存就会刷新。

将UI部件分成模块也非常有用。 每个模块都有自己的情节提要板和一组视图控制器。 服务不能总是归因于任何特定模块,因此我更喜欢将它们放置在特殊的Shared文件夹中。 其他常见的类,助手,实用程序也加入Shared 。 这是更详细的架构:

而已! 如您所见,我们为社交网络应用程序提供了一个简单而又牢固,可扩展和可测试的体系结构。