我正在使用AFNetworking库来执行异步URL请求操作,一切正常。但是,我正在为每个服务请求实例化AFNetworking对象。所以,我想为每个URL请求消除重复的对象创建。如何实现一个单身的课程?
答案 0 :(得分:1)
由于您已对问题afnetworking-2
进行了标记,因此我认为这就是您正在使用的问题。您将子类化为单个类的类别存在差异。
对于AFNetworking 2.0,您希望子类化AFHTTPSessionManager
并将子类设置为提供单个共享实例。通常,您可以在与之通信的Web服务之后命名子类,例如: WebServiceClient
。
您的AFHTTPSessionManager
子类的头文件(WebServiceClient.h)可能如下所示:
#import <Foundation/Foundation.h>
#import "AFHTTPSessionManager.h"
@interface WebServiceClient : AFHTTPSessionManager
+ (instancetype)sharedClient;
@end
您的实施文件(WebServiceClient.m)如下:
#import "WebServiceClient.h"
static NSString * const WebServiceAPIBaseURLString = @"https://api.mywebservice.com/";
@implementation WebServiceClient
+ (instancetype)sharedClient {
static WebServiceClient *_sharedClient = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
_sharedClient = [[WebServiceClient alloc] initWithBaseURL:[NSURL URLWithString:WebServiceAPIBaseURLString]];
});
return _sharedClient;
}
@end
使用此子类,您现在可以使用以下代码获取WebServiceClient
的共享实例:
WebServiceClient *client = [WebServiceClient sharedClient];
如果您想提出请求,可以执行以下操作:
WebServiceClient *client = [WebServiceClient sharedClient];
[client GET:@"/path" parameters:nil success:^(NSURLSessionDataTask *task, id responseObject) {
// Code to be executed upon successful response.
} failure:^(NSURLSessionDataTask *task, NSError *error) {
// Code to be executed on failure response.
}];
有关详细信息,您还可以找到AFNetworking source on GitHub
中包含的示例