gpt4 book ai didi

iOS 适用于通过 http 处理双向同步的最高级别网络抽象是什么?

转载 作者:塔克拉玛干 更新时间:2023-11-01 19:08:38 25 4
gpt4 key购买 nike

我正在查看 Apple networking guidelines that suggest that the user should try to work with the highest level of abstraction possible在处理网络时。

我正在开发一个客户端-服务器应用程序,其中服务器是主服务器,而 iOS 设备是从设备。它们通过 HTTP 进行通信,建立在应用程序使用 session 的生命周期内有效的连接。应用程序和服务器通过此连接同步 Assets 。

我的问题是 - 什么级别的抽象适合通过 HTTP 实现双向同步?是套接字、NSURLConnection、某些 AFNetworking 子类、输入/输出流吗?

最佳答案

对此有很多可能的好答案。我认为我所能做的就是提供一种对我来说效果很好但可能不适用于您的需求和用例的模式。重申我上面的评论“无论你做什么,都将在响应能力、功耗、数据一致性和实现成本之间进行权衡。”

我的目标抽象级别是一组服务对象,这些服务对象根据应用程序的域模型公开接口(interface)。应用程序的其余部分,主要是 Controller 层中的对象,应该能够通过将模型传递给方法(例如“fetchUserWithId:userId”或“createUser:user”)与这些服务进行通信,而无需知道 url、路径、或涉及网络层的 HTTP 动词。

这些服务对象可以将域模型操作映射到路径、HTTP 动词,以及可能的请求主体或 header 中。在大多数情况下,我发现服务本身可以共享一个较低级别的服务,该服务接受这些值并构建实际的 HTTP 请求。这提供了一个单一位置来配置主机名、设置全局 header 以及通过 NSURLRequest、NSURLSession、AFNetworking 或您喜欢的任何库管理请求队列。

我将在我的服务对象方法中包含完成 block ,以便 Controller 可以收到成功或失败的通知,但尽量不要使用这些 block 将模型传递回 Controller 层。相反,我更喜欢让 Controller 监视核心数据或其他一些持久层并对更改使用react。这样一来, Controller 就可以保持灵 active 并对他们所关注的模型中的任何更新做出响应,并且不会假设他们知道这些模型的所有可能变化来源。

到目前为止,这些都没有解决您应该如何检查对模型的远程更改。最好的选择可能是设计一个不需要这样做的系统。如果您的客户端仅在向服务器发布数据时才获得一组最近的更改,它是否仍能提供良好的用户体验呢?服务器是否可以使用推送通知偶尔通知客户端更新?

如果您必须检查更改,套接字或长轮询通常比短轮询响应更快,但漫游的移动客户端可能很难保持这些连接打开。所有这些方法还倾向于使客户的 radio 保持事件状态,并在此过程中消耗大量电量。

在不知道更多关于这个问题的情况下,我会默认使用短轮询,但尝试设计交互以允许这种情况尽可能不频繁(例如,当应用程序恢复时进行一次检查)。我还使用 HTTP 功能(etags、if-modified-since 或自定义内容范围)在没有更改时限制响应的大小。如果您有一个很好的服务层来管理网络请求,那么这也为您提供了一个引入速率限制的好地方。允许 Controller 表达对获取最新信息的兴趣,但推迟服务根据应用程序的其余部分正在做的事情来限制或批量请求(例如,如果这些模型最近更新,则不要重复相同的请求,除非用户故意触发了 Action )。

关于iOS 适用于通过 http 处理双向同步的最高级别网络抽象是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25896517/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com