【问题标题】:Right way to subclass AFHTTPSessionManager in Swift 2在 Swift 2 中继承 AFHTTPSessionManager 的正确方法
【发布时间】:2016-01-06 15:30:13
【问题描述】:

我已经在 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 应该是私有的?我如何制作此代码的实例? var x = APIManager.sharedInstance?

将 _sharedAPIManager 放在课堂之外有错吗?这段代码是否完全像我的objective-c版本一样工作,在我的objective-c实现中它也只运行那些?

【问题讨论】:

    标签: objective-c swift afnetworking


    【解决方案1】:

    您可以将_sharedAPIManager 移动到APIManager 中并将其重命名为sharedInstance。然后,您可以将初始化程序声明为私有:

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

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

    【讨论】:

    • 那我如何获取实例? var x = APIManager.sharedInstance ?所以我可以删除这个吗? class var sharedInstance : APIManager { return _sharedAPIManager }
    • 是的,你删除了原来的sharedInstance。访问方式相同:APIManager.sharedInstance
    猜你喜欢
    • 2012-04-11
    • 1970-01-01
    • 1970-01-01
    • 2017-08-25
    • 2020-11-13
    • 2011-12-30
    • 2013-11-07
    • 1970-01-01
    • 2018-06-17
    相关资源
    最近更新 更多