子类化单例未按预期工作
Subclassing a singleton not working as expected
我正在编写与 API 通信的 class。我首先创建了一个 SessionManager
:
@interface SessionManager : AFHTTPSessionManager
+ (id)sharedManager;
@end
static NSString *const kBaseURL = @"https://myapi.com";
@implementation SessionManager
- (id)init {
self = [super initWithBaseURL:[NSURL URLWithString:kBaseURL]];
if(!self) return nil;
self.responseSerializer = [AFJSONResponseSerializer serializer];
self.requestSerializer = [AFJSONRequestSerializer serializer];
return self;
}
+ (id)sharedManager {
static SessionManager *_sessionManager = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
_sessionManager = [[self alloc] init];
});
return _sessionManager;
}
@end
我写了几个 class 来扩展这个 SessionManager
。 API 中的每个实体一个:RestaurantManager
、StreetManager
和 AreaManager
。但是,当我使用其中一个然后再使用另一个时,它仍然会使用第一个。
NSArray *restaurants = [[RestaurantManager sharedManager] getRestaurants];
// restaurants contains all the restaurants
NSArray *streets = [[StreetsManager sharedManager] getStreets];
// streets still contains all the restaurants
关于如何解决这个问题有什么想法吗?
您应该覆盖子类中的 + (id)sharedManager
方法。否则,它们将转到相同的 sharedManager
方法并与相同的 static SessionManager
变量交互。
我正在编写与 API 通信的 class。我首先创建了一个 SessionManager
:
@interface SessionManager : AFHTTPSessionManager
+ (id)sharedManager;
@end
static NSString *const kBaseURL = @"https://myapi.com";
@implementation SessionManager
- (id)init {
self = [super initWithBaseURL:[NSURL URLWithString:kBaseURL]];
if(!self) return nil;
self.responseSerializer = [AFJSONResponseSerializer serializer];
self.requestSerializer = [AFJSONRequestSerializer serializer];
return self;
}
+ (id)sharedManager {
static SessionManager *_sessionManager = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
_sessionManager = [[self alloc] init];
});
return _sessionManager;
}
@end
我写了几个 class 来扩展这个 SessionManager
。 API 中的每个实体一个:RestaurantManager
、StreetManager
和 AreaManager
。但是,当我使用其中一个然后再使用另一个时,它仍然会使用第一个。
NSArray *restaurants = [[RestaurantManager sharedManager] getRestaurants];
// restaurants contains all the restaurants
NSArray *streets = [[StreetsManager sharedManager] getStreets];
// streets still contains all the restaurants
关于如何解决这个问题有什么想法吗?
您应该覆盖子类中的 + (id)sharedManager
方法。否则,它们将转到相同的 sharedManager
方法并与相同的 static SessionManager
变量交互。