如何使AFNetworking类成为单例?

时间:2014-05-23 15:32:54

标签: afnetworking afnetworking-2

我正在使用AFNetworking库来执行异步URL请求操作,一切正常。但是,我正在为每个服务请求实例化AFNetworking对象。所以,我想为每个URL请求消除重复的对象创建。如何实现一个单身的课程?

1 个答案:

答案 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

中包含的示例