From 1ee30023b9d06ae85be3af8b0698f596ecf3a7ee Mon Sep 17 00:00:00 2001 From: Michael Kirk Date: Fri, 12 May 2017 17:39:39 -0400 Subject: [PATCH 1/2] 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}; From 52be0e2ffc817b747299decfd78c41f52d0fe81d Mon Sep 17 00:00:00 2001 From: Michael Kirk Date: Fri, 12 May 2017 19:11:10 -0400 Subject: [PATCH 2/2] dont cache when parsing fails with error // FREEBIE --- src/Contacts/PhoneNumber.m | 4 ++-- src/Contacts/PhoneNumberUtil.m | 7 +++++++ 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/src/Contacts/PhoneNumber.m b/src/Contacts/PhoneNumber.m index dd42f8700..622a7c4f3 100644 --- a/src/Contacts/PhoneNumber.m +++ b/src/Contacts/PhoneNumber.m @@ -22,14 +22,14 @@ static NSString *const RPDefaultsKeyPhoneNumberCanonical = @"RPDefaultsKeyPhoneN NBPhoneNumber *number = [phoneUtil parse:text defaultRegion:regionCode error:&parseError]; if (parseError) { - DDLogWarn(@"Issue while parsing number: %@", [parseError description]); + DDLogDebug(@"Issue while parsing number: %@", [parseError description]); return nil; } NSError *toE164Error; NSString *e164 = [phoneUtil format:number numberFormat:NBEPhoneNumberFormatE164 error:&toE164Error]; if (toE164Error) { - DDLogWarn(@"Issue while parsing number: %@", [toE164Error description]); + DDLogDebug(@"Issue while formatting number: %@", [toE164Error description]); return nil; } diff --git a/src/Contacts/PhoneNumberUtil.m b/src/Contacts/PhoneNumberUtil.m index fd1ae035a..504cd43d8 100644 --- a/src/Contacts/PhoneNumberUtil.m +++ b/src/Contacts/PhoneNumberUtil.m @@ -52,6 +52,13 @@ if (!result) { result = [self.nbPhoneNumberUtil parse:numberToParse defaultRegion:defaultRegion error:error]; + if (error && *error) { + OWSAssert(!result); + return nil; + } + + OWSAssert(result); + if (result) { [self.parsedPhoneNumberCache setObject:result forKey:hashKey]; } else {