2014-04-10 84 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