0

I've had wrote and subclassed AFHTTPSessionManager in objective-c thus here is how it looks like :

+ (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;
}

And i could get an instance of this class by :

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

I've looked at the following resources on stack overflow :

AFHTTPSessionManager subclass swift

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

By implementing the following code :

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")
    }
}

Is it returning an actual singleton as the init should be private? how do i make an instance of this code ? var x = APIManager.sharedInstance ?

is it wrong to place _sharedAPIManager out of the class ? Does this code works completely like my objective-c version, also in my objective-c implementation it only runs ones ?

Community
  • 1
  • 1
Nata Mio
  • 2,168
  • 3
  • 22
  • 46

1 Answers1

2

You can move _sharedAPIManager inside APIManager and rename it sharedInstance. You can then declare the initializer as private:

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

    private init(baseURL url: NSURL!) {

You can access the singleton instance via APIManager.sharedInstance.

Cristik
  • 30,989
  • 25
  • 91
  • 127
  • then how do i get the instance ? `var x = APIManager.sharedInstance `? so i may delete this one ? `class var sharedInstance : APIManager { return _sharedAPIManager }` – Nata Mio Jan 06 '16 at 16:04
  • Yes, you delete the original `sharedInstance`. Accessing would be the same: `APIManager.sharedInstance` – Cristik Jan 06 '16 at 16:06