2017-09-20 20 views
0

API와 통신하는 클래스를 작성하고있다. 나는 SessionManager을 작성하여 시작 :이 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 

. API의 모든 개체에 대해 하나 : RestaurantManager, StreetManagerAreaManager 그래도 나는 그 중 하나를 사용하고 다른 하나를 사용할 때, 여전히 첫 번째를 사용할 것입니다.

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

// restaurants contains all the restaurants 

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

// streets still contains all the restaurants 

해결 방법에 대한 의견이 있으십니까?

+0

클래스 메소드를 대체하지 않는 한, 서브 클래스는 항상 동일한 공유 인스턴스를 사용합니다. – vadian

답변

1

서브 클래스에서 + (id)sharedManager 메소드를 대체해야합니다. 그렇지 않으면 동일한 sharedManager 메소드로 이동하여 동일한 static SessionManager 변수와 상호 작용합니다.