【问题标题】:AFHTTPRequestOperationManager property or not in shared client?AFHTTPRequestOperationManager 属性或不在共享客户端中?
【发布时间】:2014-01-25 13:17:43
【问题描述】:

我在我的应用程序中使用AFNetworking 进行所有连接。我创建了一个单独的“客户端”类,它处理所有AFNetworking 代码并使用AFHTTPRequestOperationManager。我感到困惑的是 AFHTTPRequestOperationManager 对象是否应该是一个属性,还是应该在每次要求我的客户建立连接时重新创建一个?如果它是一个属性,我的客户端是否可以异步调用多次,或者这会导致问题,因为AFHTTPRequestOperationManager 的同一个实例可能会同时使用?

【问题讨论】:

  • @DavidCaunt 我没有尝试过属性,但我确实尝试将管理器存储到实例变量中,但我遇到了糟糕的访问崩溃。由于某种原因,我分配给我的变量的实例死了。所以我认为在使用时初始化一个新的管理器(局部变量)更好(这是我所做的修复)。顺便说一句,我使用的是 ARC,所以实例变量应该有一个指向默认分配的对象的强指针,就像强属性的工作原理一样。

标签: afnetworking-2


【解决方案1】:

通常,您的单例“客户”类是AFHTTPRequestOperationManager 的子类。它也可能是一个属性,但是您将无法覆盖方法。一些常见的重写方法是:

  • - HTTPRequestOperationWithRequest:success:failure:,修改所有请求操作的构造方式(例如,如果您需要在每个请求中使用相同的标头)
  • – initWithBaseURL:,为运营经理应用额外的自定义

也就是说,根据您的需要,属性可以正常工作。 (请参阅Prefer composition over inheritance? 了解一些令人愉快的周末阅读。)

最后:

如果它是一个属性,我的客户端是否可以被异步调用多次,或者这会导致问题,因为AFHTTPRequestOperationManager 的同一个实例可能会同时被使用?

是的,AFHTTPRequestOperationManager 被设计为线程安全的。你可以告诉它从不同的线程做一些事情。 (请注意,它的完成块总是在主线程上调用,因为 UI 工作通常在那里完成。)

【讨论】:

  • 我选择不继承AFHTTPRequestOperationManager,因为最终我想在我的应用程序放弃iOS6支持时切换到AFURLSessionManager 。拥有一个中立的客户似乎更适合平稳过渡(但我可能弄错了)。我会接受您回答有关AFHTTPRequestOperationManager 线程安全的问题。
  • @Koen 是的,这是使用属性的好理由。不过,为了争论,您可以使用子类化并对类集群做同样的事情。 (您的类可能会根据当前的 iOS 版本返回不同的子类实例。)
猜你喜欢
  • 2020-12-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多