我正在开发一个连接到不同数据提供者的应用程序,因为我开始开发不同的类来处理这些提供程序,我开始看到我需要的功能之间的相似之处。所以我决定创建一个继承自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
,还是创建一个属性?我的场景会推荐什么?
答案 0 :(得分:0)
AFNetworking是一个非常好的网络库。如果你需要比基本东西更先进的东西,而你不想自己重新实现它们,那么这是一个很好的(最好的?)选择。 请注意,AF 2.0与旧版本的OSX和iOS不兼容,因此请注意您使用的AF版本。
关于您的问题。
我不是子类的粉丝。
有时你想要子类(例如UIView
,UIViewController
,...),因为它们是有意的。
但是对于更“完整”的类,使用它们更常见。如果您需要自定义行为,通常它们提供委托方法。
如果我是你,我会在你的所有对象中添加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;
}