继承,AFNetworking,良好实践?

时间:2014-06-25 05:34:45

标签: ios inheritance nsurl afnetworking-2 nsurlsession

我正在开发一个连接到不同数据提供者的应用程序,因为我开始开发不同的类来处理这些提供程序,我开始看到我需要的功能之间的相似之处。所以我决定创建一个继承自NSObject的基类,并在该类上公开一些肯定出现在所有客户端中的属性和方法。

这是基类

@interface AhmBaseDataLoader : NSObject {
    NSMutableArray *elementsArray;
}

- (void)loadElements:(NSString *)searchValue;
@property (nonatomic, strong) NSArray *Elements;

我有四个继承这个类的类,所有这些都必须

loadElements:(NSString *)searchValue {
   //I dO some data work here using NSURL and basic classes
    NSData* data = [NSData dataWithContentsOfURL:[NSURL URLWithString:url]];
}

到目前为止,我一直在子类中使用基本的NSURLSession工作来加载数据。到目前为止,这一直工作正常。这一切都发生在后台线程上。加载http进程有时可能很长,我需要能够有时取消该进程。

所以我的问题是,通过这种设置,包括afnetworking是否有益?我知道它非常受欢迎且非常快,但我很困惑如果我确实使用它,我会使我的baseloader继承自AFHTTPSessionManager,还是创建一个属性?我的场景会推荐什么?

1 个答案:

答案 0 :(得分:0)

AFNetworking是一个非常好的网络库。如果你需要比基本东西更先进的东西,而你不想自己重新实现它们,那么这是一个很好的(最好的?)选择。 请注意,AF 2.0与旧版本的OSX和iOS不兼容,因此请注意您使用的AF版本。

关于您的问题。 我不是子类的粉丝。 有时你想要子类(例如UIViewUIViewController,...),因为它们是有意的。 但是对于更“完整”的类,使用它们更常见。如果您需要自定义行为,通常它们提供委托方法。 如果我是你,我会在你的所有对象中添加AFHTTPSessionManager类型的属性(如果你使用AF 2.0)

@property (nonatomic, strong) AFHTTPSessionManager *httpSessionManager;

loadElementes:只是使用它。 在AppDelegate或您创建对象的位置,我将创建管理器并将其设置为每个对象。像

这样的东西
AFHTTPSessionManager *httpSessionManager = ... //;
AhmBaseDataLoader *myFirstLoader = [[AhmBaseDataLoader alloc] init];
myFirstLoader. httpSessionManager = httpSessionManager;

编辑:如果出于兼容性原因使用AF 1.X(和我一样),您应该使用AFHTTPClient代替AFHTTPSessionManager

EDIT2: 关于你的第一个评论。 您的超类将具有AFHTTPSessionManager,并且您的所有子类都可以访问它,这是真的。我假设他们在loadElements:方法(或其他任何方法)中使用它。 你的超类当然可以有一个init方法。 我认为所有子类只能有一个会话管理器(如果我错了,请纠正我。它使用队列来加载数据,这样你就不必费心去处理请求了)。所以我建议,在创建子类的类(例如AppDelegate)中,首先创建会话管理器,然后将其设置为所有对象。 例如:

//AppDelegate.m
- (void)applicationDidFinishLaunching:(NSNotification *)aNotification {
    ...
    AFHTTPSessionManager *httpSessionManager = ... //; create the session and configure it

    AhmBaseDataLoader *myFirstLoader = [[AhmDerived1DataLoader alloc] init];
    myFirstLoader. httpSessionManager = httpSessionManager;
    AhmBaseDataLoader *mySecondLoader = [[AhmDerived2DataLoader alloc] init];
    mySecondLoader. httpSessionManager = httpSessionManager;
    AhmBaseDataLoader *myThirdLoader = [[AhmDerived3DataLoader alloc] init];
    myThirdLoader. httpSessionManager = httpSessionManager;
    AhmBaseDataLoader *myFourthLoader = [[AhmDerived4DataLoader alloc] init];
    myFourthLoader. httpSessionManager = httpSessionManager;


}