我已经在 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/