【发布时间】:2016-12-18 23:33:54
【问题描述】:
+ (NSURLSessionDataTask *)login:(NSString*)email andPassword:(NSString*)password andCallback:(void (^)(NSArray *responseArray, NSError *error))block {
if(![self hasInternet]){return nil;}
NSLog(@"Session.login");
[APIClient sharedClient].requestSerializer = [AFJSONRequestSerializer serializer];
[[APIClient sharedClient].requestSerializer setValue:email forHTTPHeaderField:@"email"];
[[APIClient sharedClient].requestSerializer setValue:password forHTTPHeaderField:@"password"];
[[APIClient sharedClient].requestSerializer setValue:@"poop" forHTTPHeaderField:@"apikey"];
return [[APIClient sharedClient] POST:@"/login" parameters:nil progress:nil success:^(NSURLSessionDataTask * __unused task, id JSON) {
NSLog(@"session.loginWithEmail.response:%@",JSON);
if([JSON objectForKey:@"user"]){
NSMutableDictionary *user=[[NSMutableDictionary alloc] initWithDictionary:[[JSON objectForKey:@"user"] copy]];
[user setObject:password forKey:@"password"];
[[Session sharedInstance] startSession:user];
if([[Session sharedInstance] isSessionActive]){
if([JSON objectForKey:@"req_onboarding"]){
NSLog(@"session.onboard!=nil");
[Session sharedInstance].requiredOnboarding=[JSON objectForKey:@"req_onboarding"];
}
if (block) {
NSLog(@"session.login.block.success");
block(nil, nil);
}
}else{
NSLog(@"Failed to set session");
}
}
} failure:^(NSURLSessionDataTask *__unused task, NSError *error) {
if (block) {
NSLog(@"Session.login.Fail");
block([NSArray array], error);
}
}];
}
我需要一个可子类化的单例,以便能够有一个抽象的会话管理器来完成大部分工作,但仍然可以进行子类化,以便多个会话可以共存并仍然具有存在的能力在我的应用程序中可用。我正在构建我所有应用程序的一些演示,这就是为什么此功能很重要。
一切都很顺利,直到我意识到托管在超级会话类中的我的 api 方法正在引用单例本身来设置会话,这是一个问题,因为 sharedInstance 被引用如下:
+ (instancetype)sharedInstance
{
NSLog(@"[Master sharedInstance]");
id sharedInstance = nil;
@synchronized(self) {
NSLog(@"MS | synchronized(self)");
NSString *instanceClass = NSStringFromClass(self);
// Looking for existing instance
sharedInstance = [_sharedInstances objectForKey:instanceClass];
// If there's no instance – create one and add it to the dictionary
if (sharedInstance == nil) {
NSLog(@"MS | sharedInstance == nil");
sharedInstance = [[super allocWithZone:nil] init];
[_sharedInstances setObject:sharedInstance forKey:instanceClass];
NSLog(@"MS | SharedInstances:%@",_sharedInstances);
}
}
return sharedInstance;
}
当它只是一个 Session 单例时,我可以在类方法中这样做:[Session sharedInstance] isSessionActive]
但是现在,[______ sharedInstance] isSessionActive]; 是对调用类方法的特定子类的引用。是否可以从此类方法中检索特定实例的引用而不是将其作为参数发送?
【问题讨论】:
-
+login:andPassword:andCallback:方法是您自己的代码吗?或者是你不能乱用的代码?如果是您自己的,我建议将其从类方法更改为实例方法,此时您应该能够使用[self isSessionActive]如果在+login:andPassword:andCallback:上定义了Session。
标签: ios objective-c oop singleton