objective-c - 在 Swift 2 中子类化 AFHTTPSessionManager 的正确方法

标签 objective-c swift afnetworking

我已经在 objective-c 中编写并子类化了 AFHTTPSessionManager,因此它看起来是这样的:

+ (APIClient *)sharedAPIClient
{
    static APIClient *_sharedAPIClient = nil;

    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        _sharedAPIClient = [[self alloc] initWithBaseURL:[NSURL URLWithString:BaseURL]];
    });

    return _sharedAPIClient;
}

- (instancetype)initWithBaseURL:(NSURL *)url
{
    self = [super initWithBaseURL:url];

    if (self) {
        self.responseSerializer = [AFJSONResponseSerializer serializer];
        self.requestSerializer = [AFJSONRequestSerializer serializer];
    }

    return self;
}

我可以通过以下方式获得此类的实例:

var objAPIClient = APIClient()
objAPIClient = APIClient.sharedAPIClient()

我查看了以下有关堆栈溢出的资源:

AFHTTPSessionManager subclass swift

Swift - Why init(coder) is required in AFHTTPSessionManager?

通过执行以下代码:

let _sharedAPIManager = APIManager(baseURL: NSURL(string: API_URL)!)

class APIManager: AFHTTPSessionManager {

    /**
     * Singleton service 
     * (https://github.com/hpique/SwiftSingleton)
     */
    class var sharedInstance : APIManager {
        return _sharedAPIManager
    }

    init(baseURL url: NSURL!) {
        super.init(baseURL: url, sessionConfiguration: nil)

        self.responseSerializer = AFJSONResponseSerializer() as AFJSONResponseSerializer
        self.requestSerializer = AFJSONRequestSerializer() as AFJSONRequestSerializer

        self.requestSerializer.setValue(API_KEY, forHTTPHeaderField: "X-Api-Key")
        self.requestSerializer.setValue("3", forHTTPHeaderField: "X-Api-Version")
    }

    // this was inserted by XCode
    required init(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
}

它是否返回一个实际的单例,因为 init 应该是私有(private)的?我如何创建此代码的实例? var x = APIManager.sharedInstance ?

将 _sharedAPIManager 放在类之外是错误的吗?这段代码是否完全像我的 objective-c 版本一样工作,而且在我的 objective-c 实现中它只运行一个?

最佳答案

您可以将 _sharedAPIManager 移动到 APIManager 中并将其重命名为 sharedInstance。然后您可以将初始值设定项声明为私有(private)的:

class APIManager: AFHTTPSessionManager {
    static let sharedInstance = APIManager(baseURL: NSURL(string: API_URL)!)

    private init(baseURL url: NSURL!) {

您可以通过APIManager.sharedInstance访问单例实例。

关于objective-c - 在 Swift 2 中子类化 AFHTTPSessionManager 的正确方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34636829/

相关文章:

objective-c - 使用 block 参数从 Objective-C 调用 Swift 方法

ios - Swift:如何以编程方式禁用 MapKit 注释的信息按钮

ios - 401错误-使用AFNetworking AFHTTPClient和Tastypie进行基本身份验证

ios - AFNetworking 单元测试

ios - 使用文件路径初始化 AG 地理数据库的对象返回“文件未找到

ios - 下载整个网站

iphone - 如何在不卸载 super View 的情况下从 super View 中删除 View ?

ios - 是否可以更改 UITextView 和 UITextField 中单个单词的颜色

ios - 为什么要导入.m文件?

ios - 如何将普通的CGRectMake转换成单位坐标?