2014-01-25 83 views
4

我使用AFNetworking为我的应用程序中的所有连接。我创建了一个单独的“客户”类,负责所有AFNetworking代码并使用AFHTTPRequestOperationManager。我很困惑的是,AFHTTPRequestOperationManager对象应该是一个属性,还是我应该每次重新创建一个我的客户端被要求连接?如果它是一个属性,我的客户可以被异步调用多次,否则会导致问题,因为可能同时使用同一个实例AFHTTPRequestOperationManagerAFHTTPRequestOperationManager属性还是不在共享客户端?

+0

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

回答

4

通常,您的单身'客户'类将是AFHTTPRequestOperationManager的子类。它也可能是一个属性,但是你将无法覆盖方法。一些常用重载方法有:

  • - HTTPRequestOperationWithRequest:success:failure:,修改所有请求操作是如何构造(例如,如果你需要在每一个请求相同的报头)
  • – initWithBaseURL:,申请额外定制的运营经理

也就是说,一个属性可以正常工作,这取决于您的需求。 (对于一些令人愉快的周末阅读见Prefer composition over inheritance?。)

最后:

如果它是一个属性,可以在我的客户端异步调用了很多次,还是将这一事业的问题,因为AFHTTPRequestOperationManager相同的实例将可能在同一时间使用?

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

+0

我选择不要继承'AFHTTPRequestOperationManager',因为最终我想在我的应用程序丢弃iOS6支持时切换到'AFURLSessionManager'。有一个中立的客户似乎更适合平稳过渡(但我可能会误会)。我会接受你的问题来回答有关'AFHTTPRequestOperationManager'是线程安全的问题。 – Koen

+0

@Koen是的,这是使用属性的一个很好的理由。但是,为了争论,您可以使用子类化并对类集群执行相同的操作。 (你的类可以根据当前的iOS版本返回不同的子类实例。) –