2014-04-10 29 views
0

有没有更短的版本?这感觉就像很多样板。dispatch_once有更短的选择吗?

我扔在一对夫妇的例子,我觉得这是乏味

+ (instancetype)sharedInstance 
{ 
    static dispatch_once_t onceToken; 
    static id instance; 
    dispatch_once(&onceToken, ^{ 
     instance = [self new]; 
    }); 
    return instance; 
} 

+ (NSString *)RFC2822StringFromDate:(NSDate *)date 
{ 
    static NSDateFormatter *formatter; 
    static dispatch_once_t onceToken; 
    dispatch_once(&onceToken, ^{ 
     formatter = [NSDateFormatter new]; 
     formatter.locale = [[NSLocale alloc] initWithLocaleIdentifier:@"en_US"]; 
     formatter.timeZone = [NSTimeZone timeZoneWithName:@"GMT"]; 
     formatter.dateFormat = @"EEE, dd MMM yyyy HH:mm:ss Z"; 
    }); 

    return [formatter stringFromDate:date]; 
} 
+0

只是说:你有什么打算时,苹果发布一个稍微大一点的iPhone呢? – gnasher729

+0

@ gnasher729你只需对此发表评论。 – hfossli

+0

在Xcode中有一个内置的代码完成快捷方式。 – CouchDeveloper

回答

2

我只是做了一个小宏,基本上可以让你写很短的东西

+ (instancetype)sharedInstance 
{ 
    return dispatch_once_and_return(id, [self new]); 
} 

而且是块支持这个语义

+ (NSString *)altRFC2822StringFromDate:(NSDate *)date 
{ 
    NSDateFormatter *formatter = dispatch_once_and_return(NSDateFormatter *, ^{ 
     NSDateFormatter *f = [NSDateFormatter new]; 
     // setup formatter 
     return f; 
    }()); 

    return [formatter stringFromDate:date]; 
} 

(关键是要加()之后的块,它基本上立即执行该块)。

#define dispatch_once_and_return(type, value) ({\ 
    static type cachedValue;\ 
    static dispatch_once_t onceToken;\ 
    dispatch_once(&onceToken, ^{\ 
     cachedValue = value;\ 
    });\ 
    cachedValue;\ 
}) 
+3

这很好,但宏经常混淆,这使得难以维护一个程序而不是更容易。我仅将宏用于重复性任务,如填充“静态结构”条目或使用不同的值调用相同的方法。我宁愿输入原始字符串而不是使用这个宏。 – trojanfoe

+0

那么,如果GCD要用这个宏扩展,你会看到它不同吗? (它不会延长,只是一个假设的问题:) – hfossli

+0

不,我会困惑。当我输入longhand形式时,我明白'dispatch_once()'在做什么。我可以看到,我的单例存在一个“静态”实例,我可以看到“静态”一次令牌“,我宁愿在6个月内再次查找宏定义, “向后工作”来确定它在做什么。因此这个宏对我来说是反作用的。 – trojanfoe