From b0f90618aa1a85e3c50a610389d0ba8db4d206ce Mon Sep 17 00:00:00 2001 From: Francesco Frison Date: Wed, 26 Jun 2013 16:38:30 +0100 Subject: [PATCH] caching sum of langs and keys --- .../Controllers/ZFFileDetailController.m | 27 +++++----- Strings/ZFLangFile.h | 4 ++ Strings/ZFLangFile.m | 51 ++++++++++++++++++- 3 files changed, 66 insertions(+), 16 deletions(-) diff --git a/HiperStrings/Controllers/ZFFileDetailController.m b/HiperStrings/Controllers/ZFFileDetailController.m index 46ebc03..1bbdea5 100644 --- a/HiperStrings/Controllers/ZFFileDetailController.m +++ b/HiperStrings/Controllers/ZFFileDetailController.m @@ -23,22 +23,11 @@ @implementation ZFFileDetailController - (void)setLangFile:(ZFLangFile *)langFile { _langFile = langFile; - [self didSwithSegmentedControl:self.segmentedControl]; + self.columns = [[NSArray arrayWithObject:KEY_KEY] arrayByAddingObjectsFromArray:[_langFile allLanguages]]; + self.keys = (self.columns.count > 1)? [self.langFile allKeys] : [NSArray array]; -} - -#pragma mark - Segmented Controller - -- (IBAction)didSwithSegmentedControl:(NSSegmentedControl *)sender { - self.rows = (self.segmentedControl.selectedSegment == 0)? [self.langFile iOStranslations] : [self.langFile androidTranslations]; - - self.columns = [[NSArray arrayWithObject:KEY_KEY] arrayByAddingObjectsFromArray:[self.rows allKeys]]; - self.keys = (self.columns.count > 1)? [[self.rows objectForKey:[self.columns objectAtIndex:1]] allKeys] : [NSArray array]; NSMutableArray *addCol = [self.columns mutableCopy]; - - [self.tableView beginUpdates]; - NSArray *columns = [self.tableView.tableColumns copy]; [columns enumerateObjectsUsingBlock:^(NSTableColumn *column, NSUInteger idx, BOOL *stop) { if ([self.columns containsObject:column.identifier]) { @@ -54,14 +43,22 @@ - (IBAction)didSwithSegmentedControl:(NSSegmentedControl *)sender { [self.tableView addTableColumn:column]; }]; + + [self didSwithSegmentedControl:self.segmentedControl]; + +} + +#pragma mark - Segmented Controller + +- (IBAction)didSwithSegmentedControl:(NSSegmentedControl *)sender { + self.rows = (self.segmentedControl.selectedSegment == 0)? [self.langFile iOStranslations] : [self.langFile androidTranslations]; [self.tableView reloadData]; - [self.tableView endUpdates]; } #pragma mark - TableView - (NSInteger)numberOfRowsInTableView:(NSTableView *)tableView { - return [self.rows count]; + return [self.keys count]; } - (id)tableView:(NSTableView *)tableView objectValueForTableColumn:(NSTableColumn *)tableColumn row:(NSInteger)row { diff --git a/Strings/ZFLangFile.h b/Strings/ZFLangFile.h index 5d24ae5..dabe21c 100644 --- a/Strings/ZFLangFile.h +++ b/Strings/ZFLangFile.h @@ -16,7 +16,11 @@ @property (nonatomic, strong) NSMutableDictionary *iOStranslations; @property (nonatomic, strong) NSMutableDictionary *androidTranslations; +@property (nonatomic, strong) NSArray *allKeys; +@property (nonatomic, strong) NSArray *allLanguages; + - (BOOL)addFileAtURL:(NSURL *) url; - (BOOL)mergeWithFile:(ZFLangFile *)file; +- (void)finalizeMerge; @end diff --git a/Strings/ZFLangFile.m b/Strings/ZFLangFile.m index 038db08..c4b8601 100644 --- a/Strings/ZFLangFile.m +++ b/Strings/ZFLangFile.m @@ -10,6 +10,8 @@ #import "ZFStringsConverter.h" #import "ZFUtils.h" +#define FAV_LANG @"en" + @interface ZFLangFile () @property (nonatomic, strong) NSArray *hashKeys; @@ -57,6 +59,7 @@ - (BOOL)addFileAtURL:(NSURL *)url { BOOL isIOS; NSString *lang = [[ZFUtils sharedUtils] langFromURL:url isIOS:&isIOS]; if (!lang) return NO; + BOOL alreadyExists = (isIOS)? ([self.iOStranslations objectForKey:lang] != nil) : ([self.androidTranslations objectForKey:lang] != nil); if (alreadyExists) return NO; @@ -73,6 +76,9 @@ - (BOOL)addFileAtURL:(NSURL *)url { [self.androidTranslations setObject:translations forKey:lang]; } + self.allKeys = nil; + self.allLanguages = nil; + return YES; } @@ -95,7 +101,50 @@ - (BOOL)mergeWithFile:(ZFLangFile *)file { mergeAndroid = YES; }]; - return (mergeIOS || mergeAndroid); + BOOL didMerge = (mergeIOS || mergeAndroid); + if (didMerge) { + self.allKeys = nil; + self.allLanguages = nil; + } + return didMerge; +} + +- (void)fillGaps { + NSMutableArray *allKeys = [NSMutableArray array]; + NSMutableArray *allLanguages = [NSMutableArray array]; + + [self.iOStranslations enumerateKeysAndObjectsUsingBlock:^(NSString *lang, NSDictionary *translation, BOOL *stop) { + if (![allLanguages containsObject:lang]) [allLanguages addObject:lang]; + [translation.allKeys enumerateObjectsUsingBlock:^(NSString *key, NSUInteger idx, BOOL *stop) { + if ([allKeys containsObject:key]) return; + [allKeys addObject:key]; + }]; + }]; + + [self.androidTranslations enumerateKeysAndObjectsUsingBlock:^(NSString *lang, NSDictionary *translation, BOOL *stop) { + if (![allLanguages containsObject:lang]) [allLanguages addObject:lang]; + [translation.allKeys enumerateObjectsUsingBlock:^(NSString *key, NSUInteger idx, BOOL *stop) { + if ([allKeys containsObject:key]) return; + [allKeys addObject:key]; + }]; + }]; + + _allKeys = [allKeys sortedArrayUsingSelector:@selector(compare:)]; + _allLanguages = [allLanguages sortedArrayUsingComparator:^NSComparisonResult(NSString *obj1, NSString *obj2) { + if ([obj1 isEqualToString:FAV_LANG]) return NSOrderedAscending; + else if ([obj2 isEqualToString:FAV_LANG]) return NSOrderedDescending; + else return [obj1 compare:obj2]; + }]; +} + +- (NSArray *)allKeys { + if (!_allKeys) [self fillGaps]; + return _allKeys; +} + +- (NSArray *)allLanguages { + if (!_allLanguages) [self fillGaps]; + return _allLanguages; } @end