Skip to content

Commit 39ab7b8

Browse files
committed
Merge pull request #591 from ParsePlatform/nlutsenko.dateFormatter
Improve performance of string from date creation.
2 parents 79e3111 + 1d4fe38 commit 39ab7b8

File tree

1 file changed

+17
-19
lines changed

1 file changed

+17
-19
lines changed

Parse/Internal/PFDateFormatter.m

Lines changed: 17 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -10,22 +10,20 @@
1010
#import "PFDateFormatter.h"
1111

1212
#import <sqlite3.h>
13+
#import <sys/time.h>
1314

1415
@interface PFDateFormatter () {
1516
dispatch_queue_t _synchronizationQueue;
1617

1718
sqlite3 *_sqliteDatabase;
1819
sqlite3_stmt *_stringToDateStatement;
20+
sqlite3_stmt *_dateToStringStatement;
1921
}
2022

21-
@property (nonatomic, strong, readonly) NSDateFormatter *preciseDateFormatter;
22-
2323
@end
2424

2525
@implementation PFDateFormatter
2626

27-
@synthesize preciseDateFormatter = _preciseDateFormatter;
28-
2927
///--------------------------------------
3028
#pragma mark - Init
3129
///--------------------------------------
@@ -52,37 +50,37 @@ - (instancetype)init {
5250
-1,
5351
&_stringToDateStatement,
5452
NULL);
53+
sqlite3_prepare_v2(_sqliteDatabase,
54+
"SELECT strftime('%Y-%m-%dT%H:%M:%fZ', ?, 'unixepoch');",
55+
-1,
56+
&_dateToStringStatement,
57+
NULL);
5558

5659
return self;
5760
}
5861

5962
- (void)dealloc {
6063
sqlite3_finalize(_stringToDateStatement);
64+
sqlite3_finalize(_dateToStringStatement);
6165
sqlite3_close(_sqliteDatabase);
6266
}
6367

64-
///--------------------------------------
65-
#pragma mark - Date Formatters
66-
///--------------------------------------
67-
68-
- (NSDateFormatter *)preciseDateFormatter {
69-
if (!_preciseDateFormatter) {
70-
_preciseDateFormatter = [[NSDateFormatter alloc] init];
71-
_preciseDateFormatter.locale = [NSLocale localeWithLocaleIdentifier:@"en_US_POSIX"];
72-
_preciseDateFormatter.timeZone = [NSTimeZone timeZoneForSecondsFromGMT:0];
73-
_preciseDateFormatter.dateFormat = @"yyyy-MM-dd'T'HH:mm:ss.SSS'Z'";
74-
}
75-
return _preciseDateFormatter;
76-
}
77-
7868
///--------------------------------------
7969
#pragma mark - String from Date
8070
///--------------------------------------
8171

8272
- (NSString *)preciseStringFromDate:(NSDate *)date {
8373
__block NSString *string = nil;
74+
NSTimeInterval interval = [date timeIntervalSince1970];
8475
dispatch_sync(_synchronizationQueue, ^{
85-
string = [self.preciseDateFormatter stringFromDate:date];
76+
sqlite3_bind_double(_dateToStringStatement, 1, interval);
77+
78+
if (sqlite3_step(_dateToStringStatement) == SQLITE_ROW) {
79+
const char *sqliteString = (const char *)sqlite3_column_text(_dateToStringStatement, 0);
80+
string = [NSString stringWithUTF8String:sqliteString];
81+
}
82+
83+
sqlite3_reset(_dateToStringStatement);
8684
});
8785
return string;
8886
}

0 commit comments

Comments
 (0)