创建NSDateFormatter可重用类

时间:2013-11-13 19:34:10

标签: ios json nsdateformatter

在我的应用程序中,JSON日期字符串会被解析不同的时间(在我的视图控制器,详细视图控制器和共享此页面操作中)。我想只设置一个NSDateFormatter并在必要时重复使用它。

到目前为止,我有一个NSObject文件(UpcomingRelease)

UpcomingRelease.h

+ (NSString *) formattedDate:(NSString *)jsonDateString;

UpcomingRelease.m

+ (NSString *) formattedDate:(NSString *)jsonDateString {
    NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
    [dateFormatter setDateFormat:@"yyyy-MM-dd'T'HH:mm:ss.SSS'Z'"];
    NSDate *readableDate = [dateFormatter dateFromString:jsonDateString];

    [dateFormatter setDateFormat:@"MMMM dd"];
    return [dateFormatter stringFromDate:readableDate];
}

现在在我的detailedViewController中导入了“UpcomingRelease.h”,我在viewLoad中有了这段代码

NSString *formattedDate = [self formattedDate:[_singleRelease objectForKey:@"release_date"]];
self.release_date.text = [NSString stringWithFormat:@"%@", formattedDate];

但是我得到一个错误说:“'ReleaseViewController'没有可见的@interface声明选择器'formattedDate:'”。如果我将formattedDate代码直接添加到它工作的页面(使用 - 而不是+),但是当我尝试从NSObject调用它时不会。

我做错了什么?

感谢。

1 个答案:

答案 0 :(得分:2)

改变这个:

NSString *formattedDate = [self formattedDate:[_singleRelease objectForKey:@"release_date"]];

为:

NSString *formattedDate = [UpcomingRelease formattedDate:[_singleRelease objectForKey:@"release_date"]];

由于您将formattedDate:定义为类方法,因此需要在类上调用它。

正如评论中指出的那样,你的代码效率非常低,因为每次使用该方法时都会重新创建日期格式化程序实例。

+ (NSString *) formattedDate:(NSString *)jsonDateString {
    static NSDateFormatter *jsonFormatter = nil;
    static NSDateFormatter *readableFormatter = nil;
    if (!jsonFormatter) {
        jsonFormatter = [[NSDateFormatter alloc] init];
        [jsonFormatter setDateFormat:@"yyyy-MM-dd'T'HH:mm:ss.SSS'Z'"];
        readableFormatter = [[NSDateFormatter alloc] init];
        [readableFormatter setDateFormat:@"MMMM dd"];
        // Note - this code will not deal with a user changing the Region Format on their device
    }

    NSDate *readableDate = [jsonFormatter dateFromString:jsonDateString];

    return [readableFormatter stringFromDate:readableDate];
}
相关问题