0

我们正在使用 AFNetworking 从我们的移动应用程序发出版本化 API 请求。

为了针对我们 API 的特定版本,我们的应用程序会发送一个特殊的 Accept Header。

我已经组织了我的代码库,以便每个资源(用户、会话、图像等)都有自己的 AFHTTPClient,它在初始化时设置 Accept 标头。

+ (UsersAPIClient *)sharedClient
{
    // removed singleton setup code for brevity
                                                                 // here's where my version gets set for all requests pertaining to Users
    __sharedClient = [[UsersAPIClient alloc] initWithBaseURL:url andVersion:2]; 
    return __sharedClient;
}

我是这样设置的,这样每个请求(创建用户、编辑用户、获取用户)都不必担心要调用哪个版本;这在创建特定 APIClient 时已经完成。

该系统运行良好,但我只是质疑我是否应该这样做?我们有大约 9 个对象,因此在 BaseAPIClient 类之上有 18 个文件(.h、.m),一切都继承自。

是否应该将我的所有网络代码都放在一个文件中,并且每个请求在发出请求之前都设置适当的 Accept Header?通过加载 9 个不同的客户端类而不是仅加载 1 个巨型客户端类,是否存在显着的内存开销?在设计这个系统时,我认为只根据需要和按需创建 APIClients 是有利的。如果用户打开应用程序并且从未登录,那么我永远不需要加载负责创建会话的代码。如果我所有的网络代码都塞在一个文件中,那么当用户第一次执行任何需要 HTTP 请求的操作时,所有网络代码都会立即加载到内存中。

4

1 回答 1

0

我认为主要问题是您的客户在实例化后从未释放(单例保留指向自身的指针对吗?)。然后,您将在应用程序的整个生命周期内将所有这些对象保存在内存中。也可能更难维护。

你有几个版本?因为减少这种情况的一个简单步骤可能是每个版本而不是每个对象的客户端,并且对象只调用正确的版本。

我会做的是有一个文件:

  • 在初始化期间为每个版本实例化一个客户端
  • 具有选择正确客户端的调用方法,以便对象调用此方法,并且您可以集中处理版本的位置。

此外,如果它只是设置请求标头,也许您可​​以只有一个客户端并在调用中设置正确的标头。这样您就不会保持多个客户端实例化。

于 2013-07-17T15:58:28.560 回答