短打电话给单身人士

时间:2013-11-28 14:38:27

标签: objective-c design-patterns singleton dry

使用工作代码进行更新。问题就像@HotLinks状态,我做init而不是initWithBaseURL:url

我在我的应用中使用Singleton,基于this guide

现在每次使用单身人士时,我都喜欢这样:

SingletonClass* sharedSingleton = [SingletonClass sharedInstance];
[sharedSingleton callAMethod];

// or 

[[SingletonClass sharedInstance] callAMethod];

有没有办法使用简短的语法,特别是如果我必须多次使用Singleton类似于:

[sc callAMethod];

我已经尝试过这种方法了,但它没有用,因为没有调用init方法......

WebApi.h

#import "AFHTTPRequestOperationManager.h"
#import "SingletonClass.h"

@interface WebApi : AFHTTPRequestOperationManager

@property (nonatomic, strong) SingletonClass *sc;

+(WebApi*)sharedInstance;

-(void)sandbox;

@end

WebApi.m(使用工作代码更新)

#import "WebApi.h"

@implementation WebApi

//-(WebApi*)init {
-(WebApi*)initWithBaseURL:url {
    self = [super init];
    if (self != nil) {
        self.sc = [SingletonClass sharedInstance];  // is never called.
    }
    return  self;
}

#pragma mark - Singleton methods
/**
 * Singleton methods
 */
+(WebApi*)sharedInstance
{
    static WebApi *sharedInstance = nil;
    static dispatch_once_t oncePredicate;
    dispatch_once(&oncePredicate, ^{
        sharedInstance = [[self alloc] initWithBaseURL:[NSURL URLWithString:kApiHost]];
    });        
    return sharedInstance;
}

-(void)sandbox {
 DLog(@"test short singleton call: %@", [sc callAMethod]; 
}
@end

调试消息

  

[WebApi沙箱] [第42行]测试短单例调用:(null)

3 个答案:

答案 0 :(得分:1)

我不知道你怎么能用任何语言做到这一点。在Java中,您通常会看到

<Class>.getInstance().<blah>.

没有什么能阻止你将这个实例放入一个会被大量使用的方法中,例如。

WebApi *api = [WebApi sharedInstance];

然后很多:

[api <method1>];
...

那会让你到那儿吗?

(有趣的是,开发人员和我昨天正在讨论这个问题,因为Apple使用加速度计的示例代码将运动管理器放入应用程序委托中,并且掌握管理器的语法完全是疯了:

CMMotionManager *mManager = [(APLAppDelegate *)[[UIApplication sharedApplication] delegate] sharedManager];

正如你所看到的,他们正在制作一个局部变量,然后在控制器类中从那里开始。

答案 1 :(得分:1)

您可以声明一个全局变量并在+sharedInstance方法中进行设置,然后确保拨打+sharedInstance一次。

但是,真的,不要打扰。使用[SomeClass sharedInstance]可以轻松量化代码库中共享实例的所有用法,以及SomeClass类级API的所有用法。对于最终维护代码的其他人来说,两者都非常有用。

其次,它并没有真正保存 多次输入。不足以证明要求每个人都了解新的全球。


(Rob说的):

最后,如果要在作用域中重复调用共享实例上的实例方法,只需使用局部变量:

ThingManager *thingManager = [ThingManager sharedInstance];
[thingManager foo];
[thingManager bar];
[thingManager baz];

答案 2 :(得分:0)

你可以这样做:

在.h文件中

@interface WebApi : AFHTTPRequestOperationManager

@property (nonatomic, strong) SingletonClass *sc;
...
+(id) methodName;
...
@end

在.m文件中

+(id) methodName
{
    return [[WebApi shareInstance] instanceMethod];
}

- (id) instanceMethod
{
     return @"SMTH";
}