From 1ee30023b9d06ae85be3af8b0698f596ecf3a7ee Mon Sep 17 00:00:00 2001 From: Michael Kirk Date: Fri, 12 May 2017 17:39:39 -0400 Subject: [PATCH] Reduce time between editing contacts and seeing those changes in the app * Move a couple lib methods behind our own interface * Cache parsing phone numbers since it's expensive * I considered caching formatting as well since it's also a bit expensive, but generating an appropriate cache key was actually slower than the raw implementation. // FREEBIE --- src/Contacts/PhoneNumber.m | 2 +- src/Contacts/PhoneNumberUtil.h | 5 +++++ src/Contacts/PhoneNumberUtil.m | 34 ++++++++++++++++++++++++++++++++++ 3 files changed, 40 insertions(+), 1 deletion(-) diff --git a/src/Contacts/PhoneNumber.m b/src/Contacts/PhoneNumber.m index b29d3d30c..dd42f8700 100644 --- a/src/Contacts/PhoneNumber.m +++ b/src/Contacts/PhoneNumber.m @@ -16,7 +16,7 @@ static NSString *const RPDefaultsKeyPhoneNumberCanonical = @"RPDefaultsKeyPhoneN OWSAssert(text != nil); OWSAssert(regionCode != nil); - NBPhoneNumberUtil *phoneUtil = [PhoneNumberUtil sharedUtil].nbPhoneNumberUtil; + PhoneNumberUtil *phoneUtil = [PhoneNumberUtil sharedUtil]; NSError *parseError = nil; NBPhoneNumber *number = [phoneUtil parse:text defaultRegion:regionCode error:&parseError]; diff --git a/src/Contacts/PhoneNumberUtil.h b/src/Contacts/PhoneNumberUtil.h index 6cd131596..2e7ea268b 100644 --- a/src/Contacts/PhoneNumberUtil.h +++ b/src/Contacts/PhoneNumberUtil.h @@ -26,4 +26,9 @@ + (instancetype)sharedUtil; +- (NBPhoneNumber *)parse:(NSString *)numberToParse defaultRegion:(NSString *)defaultRegion error:(NSError **)error; +- (NSString *)format:(NBPhoneNumber *)phoneNumber + numberFormat:(NBEPhoneNumberFormat)numberFormat + error:(NSError **)error; + @end diff --git a/src/Contacts/PhoneNumberUtil.m b/src/Contacts/PhoneNumberUtil.m index bf41f8be0..fd1ae035a 100644 --- a/src/Contacts/PhoneNumberUtil.m +++ b/src/Contacts/PhoneNumberUtil.m @@ -6,10 +6,12 @@ #import "ContactsManagerProtocol.h" #import "FunctionalUtil.h" #import "Util.h" +#import @interface PhoneNumberUtil () @property (nonatomic, readonly) NSMutableDictionary *countryCodesFromCallingCodeCache; +@property (nonatomic, readonly) NSCache *parsedPhoneNumberCache; @end @@ -32,6 +34,7 @@ if (self) { _nbPhoneNumberUtil = [[NBPhoneNumberUtil alloc] init]; _countryCodesFromCallingCodeCache = [NSMutableDictionary new]; + _parsedPhoneNumberCache = [NSCache new]; OWSSingletonAssert(); } @@ -39,6 +42,37 @@ return self; } +- (nullable NBPhoneNumber *)parse:(NSString *)numberToParse + defaultRegion:(NSString *)defaultRegion + error:(NSError **)error +{ + NSString *hashKey = [NSString stringWithFormat:@"numberToParse:%@defaultRegion:%@", numberToParse, defaultRegion]; + + NBPhoneNumber *result = [self.parsedPhoneNumberCache objectForKey:hashKey]; + + if (!result) { + result = [self.nbPhoneNumberUtil parse:numberToParse defaultRegion:defaultRegion error:error]; + if (result) { + [self.parsedPhoneNumberCache setObject:result forKey:hashKey]; + } else { + [self.parsedPhoneNumberCache setObject:[NSNull null] forKey:hashKey]; + } + } + + if ([result class] == [NSNull class]) { + return nil; + } else { + return result; + } +} + +- (NSString *)format:(NBPhoneNumber *)phoneNumber + numberFormat:(NBEPhoneNumberFormat)numberFormat + error:(NSError **)error +{ + return [self.nbPhoneNumberUtil format:phoneNumber numberFormat:numberFormat error:error]; +} + // country code -> country name + (NSString *)countryNameFromCountryCode:(NSString *)countryCode { NSDictionary *countryCodeComponent = @{NSLocaleCountryCode : countryCode};