我是一个iOS开发人员,有一定的经验,这个问题对我来说真的很有趣。我看到了关于这个话题的很多不同的资源和材料,但尽管如此,我还是感到困惑。iOS联网应用的最佳架构是什么?我指的是基本的抽象框架,模式,它将适合每一个网络应用程序,无论是一个只有几个服务器请求的小应用程序,还是一个复杂的REST客户机。苹果建议将
我是否需要为
我应该为所有这些网络东西创建另一个层,比如
我知道有一些很好的方法,或者像Facebook客户端或LinkedIn客户端这样的移动怪兽是如何处理成倍增长的复杂网络逻辑的呢?
我知道这个问题没有确切而正式的答案。 。最好的建议方法将被标记为接受,并奖励与声誉赏金,其他将被支持。这主要是一个理论性和研究性的问题。我想了解iOS中网络应用程序的基本,抽象和正确的架构方法。我希望从经验丰富的开发人员的详细解释。
因为所有的iOS应用程序都是不同的,所以我认为这里有不同的方法可以考虑,但我通常会这样做:
创建一个中央管理器(单例)类来处理所有的API请求(通常命名为APICommunicator),每个实例方法都是一个API调用。并且有一个中央(非公共)方法:
-Code(RACSignal*)SendGetToServerToSubPath:NSString*)带有参数的路径:NSDictionary*)Params/Code>
请注意,我使用两个主要的库/框架,reactiveCoa和afnetworking。ReactiveCoa可以完美地处理异步网络响应(sendnext:,senderror:等)。
此方法调用API,获取结果并通过RAC以'raw'格式发送它们(如NSArray what AFNetworking返回)。
然后调用上述方法的
订阅控制器通过
我在不同的应用程序中尝试了很多方法,但这一个效果最好,所以我最近在一些应用程序中使用了这一方法,它适用于小型和大型项目,并且如果需要修改某些内容,它很容易扩展和维护。
希望这对我有帮助,我想听听其他人对我的方法的看法,也许其他人认为这可以如何改进。
根据这个问题的目的,我想描述一下我们的架构方法。
我们的通用iOS应用体系结构基于以下几种模式:服务层,MVVM,UI数据绑定,依赖注入;和函数式反应编程范型。
我们可以将一个典型的面向消费者的应用程序分成以下逻辑层:
组装层是我们应用程序的一个引导点。它包含一个依赖注入容器和应用程序对象及其依赖项的声明。这一层还可能包含应用程序配置(URL,第三方服务密钥等)。为此,我们使用台风库。
模型层包含领域模型的类,验证,映射。我们使用Mantle库来映射模型:它支持序列化/反序列化到
json ode="">
格式和
服务层声明用于与外部系统交互的服务,以便发送或接收在域模型中表示的数据。因此,通常我们有与服务器API(每个实体),消息传递服务(如PubNub),存储服务(如AmazonS3)等进行通信的服务。基本上,服务包装SDK(如PubNub SDK)提供的对象或实现它们自己的通信逻辑。对于一般的网络,我们使用AFNetworking库。
存储层的目的是组织设备上的本地数据存储。我们使用核心数据或领域来实现这一点(两者都有优缺点,决定使用什么是基于具体的规格。对于核心数据设置,我们使用MDMCoreData库和一堆类-存储库(类似于服务),它们为每个实体提供对本地存储的访问。对于Realm,我们只是使用类似的存储来访问本地存储。
经理层是抽象/包装器居住的地方。
在经理角色中可以是:
因此,管理者的角色可以是实现应用程序工作所需的特定方面或关注点的逻辑的任何对象。
我们尽量避免单人,但如果需要的话,这一层是他们居住的地方。
协调器层提供依赖于其他层(服务,存储,模型)的对象的对象,以便将它们的逻辑组合到某个模块(特征,屏幕,用户故事或用户体验)所需的一个工作序列中。它通常将异步操作链化,并知道如何对它们的成功和失败案例做出反应。例如,您可以想象一个消息传递特性和相应的
null
null
为了避免大量的视图控制器,我们使用MVVM模式并在ViewModels中实现UI表示所需的逻辑。ViewModel通常将协调器和管理器作为依赖项。ViewControllers使用的ViewModel和某些类型的视图(例如,表视图单元格)。ViewControllers和ViewModel之间的粘合剂是数据绑定和命令模式。为了使这种粘合成为可能,我们使用ReactiveCocoa库。
我们还使用ReactiveCocoa及其
我们尝试以声明的方式实现我们的UI行为。数据绑定和自动布局大大有助于实现这一目标。
基础结构层包含应用程序工作所需的所有助手,扩展和实用程序。
这种方法对我们和我们通常构建的那些类型的应用程序都很有效。但是您应该明白,这只是一种主观的方法,应该根据具体的团队目的进行调整/改变。
null
此外,您可以在此博客文章iOS开发即服务中找到更多有关iOS开发过程的信息
您说:
首先,我认为,我们应该为联网创建另一层,因为我们不想要胖控制器或笨重的,不堪重负的模型。我不相信那些
It encapsulates the application's business logic, controlling transactions
and coordinating responses in the implementation of its operations.
null
在我们的
我总是广泛使用两个库:AFNetworking2.0和ReactiveCoA。我认为对于任何与网络和Web服务交互或包含复杂UI逻辑的现代应用程序来说,它都是必须具备的。
体系结构BR>
首先,我创建一个常规的
我想提到的是,如果您有复杂的模型序列化逻辑--那么就为它创建另一个层:比如数据映射器,但更通用,例如JSON/XML-&>;模型映射器。如果您有缓存:那么也将其创建为一个单独的层/服务(您不应该将业务逻辑与缓存混合在一起)。为什么?因为正确的缓存层可能非常复杂,有它自己的gotchas。人们通过实现复杂的逻辑来获得有效的,可预测的高速缓存,例如基于Profunctor的投影的monoidal高速缓存。你可以读一下这个叫做卡洛斯的美丽图书馆来了解更多。而且不要忘记,核心数据确实可以帮助您解决所有缓存问题,并允许您编写更少的逻辑。另外,如果在
在服务层完成所有这些操作之后,调用者(视图控制器)可以在
然后每个视图控制器再次使用DI注入它需要的服务类,调用适当的服务方法,并将它们的结果与UI逻辑组合在一起。对于依赖注入,我喜欢使用BloodMagic或者更强大的框架Typhoon。我从不使用单例,上帝
在我们的示例中,单个实例的所有权不是问题,而且在将god manager划分为服务之后,我们也不需要全局访问,因为现在只有一个或多个专用控制器需要特定的服务(例如
我们应该始终尊重
一种参数是普通数据参数。这就是我们传递的函数,操作,修改,持久化等等。这些是实体,聚合,集合,案例类。另一类是服务参数。这些是封装业务逻辑,允许与外部系统通信,提供数据访问的类。
null
这里通过示例给出了我的架构的一般工作流程。假设我们有一个
- (RACSignal *)removeFriend:(Friend * const)friend
其中
如果我们的应用程序是一个非常大的应用程序,我们必须把我们的逻辑分离得更清楚。例如。将
存储库将某种类型的所有对象表示为一个概念集合。它的作用类似于集合,只是具有更复杂的查询功能。
因此,
- (RACSignal *)approveFriendRequest:(FriendRequest * const)request;
绝对是一个业务逻辑,因为它超出了基本的
我给您描述了一个“旧的”Objective-C示例,但是这种方法可以非常容易地适应Swift语言,并且有更多的改进,因为它有更多有用的特性和功能糖。我强烈推荐使用这个库:莫亚。它允许您创建一个更优雅的
因此,我描述了我的通用架构方法,我认为它可以适用于任何应用程序。当然,还可以有更多的改进。我建议您学习函数式编程,因为您可以从中受益良多,但也不要太过分。通常,消除过度的,共享的,全局可变状态,创建一个不可变的域模型或创建没有外部副作用的纯函数是一种良好的做法,新的
因此,<大量阅读代码,混合,实验,并尝试从不同的架构方法中挑选出最好的代码>。这是我能给你的最好的建议。
我是一个有经验的iOS开发人员,这个问题对我来说真的很有趣。我看到了很多关于这个话题的不同的资源和材料,但尽管如此,我仍然感到困惑。一个iOS联网应用程序的最佳架构是什么?我指的是基本的抽象框架和模式,它适合每一个网络应用程序,无论是只有少量服务器请求的小应用程序,还是复杂的REST客户端。苹果推荐使用作为所有iOS应用程序的基本架构方法,但无论是还是更现代的模式都没有说明网络逻辑代码应该放在哪里
问题内容: 我正在制作一个Android应用程序。因为它是如此简单,所以我首先想到我可以简单地消除充当中间件的服务器上对Java应用程序的需求。我尝试使用MySQL的JDBC驱动程序直接连接到数据库,但是我的程序崩溃了,所以我不确定Android是否“支持” MySQL的JDBC驱动程序。 因此,我正在考虑如何实施该应用程序。基本上,应用程序从远程MySQL数据库写入一些数据,并从远程MySQL数
我的应用程序与一些外部服务集成,并向该服务请求数据。我只是想知道在客户端建模响应的最佳实践是什么,尤其是在客户端业务逻辑只需要一些数据的情况下。我正在考虑以下实施: 将JSON转换为包含所有数据/属性的类对象,并在我的代码中使用此类对象 将JSON转换为仅包含进一步处理所需的数据/属性的类对象 以上两者的组合(创建包含所有属性的类对象,然后将其转换为仅包含进一步业务逻辑所需属性的对象)
问题内容: 以下是我典型的程序的整体结构。 funA funB并在用户单击按钮1、2、3时funC打开另一个Toplevel带有窗口小部件的窗口。 我想知道这是否是编写python tkinter程序的正确方法吗?当然,即使我这样写也可以,但这是最好的方法吗?听起来很愚蠢,但是当我看到其他人编写的代码时,他们的代码并没有弄乱一堆函数,而且大多数情况下都有类。 有没有作为良好实践应遵循的特定结构?开
问题内容: 我将要构建一个将使用RESTful Web服务的Android应用程序。我不想自己编写REST客户端,因为我希望它尽可能有效和稳定(这是我第一次使用REST)。 我可以在项目中使用任何(免费)适用于Android / Java的框架或实用程序吗? 问题答案: Restlet是一个出色的REST框架,并且具有Android版本。
问题内容: 你将如何为Java应用程序实现插件系统? 是否有一个易于使用的(对于开发人员而言)系统可以实现以下目的: 用户将其插件放入应用程序的子目录中 插件可以提供配置屏幕 如果使用框架,那么许可证是否与商业开发兼容? 问题答案: 首先,你需要一个所有插件都需要实现的接口,例如 然后,插件作者应将其插件捆绑到JAR文件中。你的应用程序将打开JAR文件,然后可以使用JAR清单中的属性或JAR文件中