2017-09-20 2 views
0

J'écris une classe qui communique avec une API. J'ai commencé par la création d'un SessionManager:Sous-classer un singleton ne fonctionne pas comme prévu

@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 

j'ai écrit plusieurs classes qui étendent ce SessionManager. Un pour chaque entité dans l'API: RestaurantManager, StreetManager et AreaManager. Ce qui se passe, cependant, c'est que quand j'utilise l'un d'eux et puis un autre, il utilisera toujours le premier.

NSArray *restaurants = [[RestaurantManager sharedManager] getRestaurants]; 

// restaurants contains all the restaurants 

NSArray *streets = [[StreetsManager sharedManager] getStreets]; 

// streets still contains all the restaurants 

Des idées sur la façon de résoudre ce problème?

+0

Tant que vous ne surchargez pas la méthode de classe, les sous-classes utilisent toujours la même instance partagée. – vadian

Répondre

1

Vous devez remplacer les méthodes + (id)sharedManager dans les sous-classes. Sinon, ils vont à la même méthode et interagissent avec la même variable static SessionManager.