From dd51a6bf0e67ab4ca3aea6f50da1e196ffaab636 Mon Sep 17 00:00:00 2001 From: Michael Haney Date: Tue, 18 Dec 2018 15:08:36 -0800 Subject: [PATCH 1/6] s/GDLLogClock/GDLClock/ This isn't a class of log clocks, it's a class of clocks. --- .../GoogleDataLogger/Classes/{GDLLogClock.h => GDLClock.h} | 2 +- .../GoogleDataLogger/Classes/{GDLLogClock.m => GDLClock.m} | 4 ++-- .../GoogleDataLogger/Classes/Private/GDLLogEvent_Private.h | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) rename GoogleDataLogger/GoogleDataLogger/Classes/{GDLLogClock.h => GDLClock.h} (97%) rename GoogleDataLogger/GoogleDataLogger/Classes/{GDLLogClock.m => GDLClock.m} (92%) diff --git a/GoogleDataLogger/GoogleDataLogger/Classes/GDLLogClock.h b/GoogleDataLogger/GoogleDataLogger/Classes/GDLClock.h similarity index 97% rename from GoogleDataLogger/GoogleDataLogger/Classes/GDLLogClock.h rename to GoogleDataLogger/GoogleDataLogger/Classes/GDLClock.h index 107b4a8a4db..9e42e5e3883 100644 --- a/GoogleDataLogger/GoogleDataLogger/Classes/GDLLogClock.h +++ b/GoogleDataLogger/GoogleDataLogger/Classes/GDLClock.h @@ -31,7 +31,7 @@ typedef struct { } GDLLogClockSnapshot; /** This class manages the device clock and produces snapshots of the current time. */ -@interface GDLLogClock : NSObject +@interface GDLClock : NSObject // TODO(mikehaney24): - (GDLLogClockSnapshot)snapshot; diff --git a/GoogleDataLogger/GoogleDataLogger/Classes/GDLLogClock.m b/GoogleDataLogger/GoogleDataLogger/Classes/GDLClock.m similarity index 92% rename from GoogleDataLogger/GoogleDataLogger/Classes/GDLLogClock.m rename to GoogleDataLogger/GoogleDataLogger/Classes/GDLClock.m index 0935d8ba841..224f14f3455 100644 --- a/GoogleDataLogger/GoogleDataLogger/Classes/GDLLogClock.m +++ b/GoogleDataLogger/GoogleDataLogger/Classes/GDLClock.m @@ -14,8 +14,8 @@ * limitations under the License. */ -#import "GDLLogClock.h" +#import "GDLClock.h" -@implementation GDLLogClock +@implementation GDLClock @end diff --git a/GoogleDataLogger/GoogleDataLogger/Classes/Private/GDLLogEvent_Private.h b/GoogleDataLogger/GoogleDataLogger/Classes/Private/GDLLogEvent_Private.h index 1df364bcb58..ad1b1ee07d9 100644 --- a/GoogleDataLogger/GoogleDataLogger/Classes/Private/GDLLogEvent_Private.h +++ b/GoogleDataLogger/GoogleDataLogger/Classes/Private/GDLLogEvent_Private.h @@ -16,7 +16,7 @@ #import "GDLLogEvent.h" -#import "GDLLogClock.h" +#import "GDLClock.h" NS_ASSUME_NONNULL_BEGIN From 82eed49568c35e7aedcb345396c94ff511999a89 Mon Sep 17 00:00:00 2001 From: Michael Haney Date: Tue, 18 Dec 2018 17:05:37 -0800 Subject: [PATCH 2/6] Create some core infrastructure to support backends and prioritization of logs. --- .../GoogleDataLogger/Classes/GDLRegistrar.m | 28 +++++++++++ .../Classes/Private/GDLRegistrar_Private.h | 28 +++++++++++ .../Classes/Public/GDLLogBackend.h | 39 +++++++++++++++ .../Classes/Public/GDLLogScorer.h | 46 +++++++++++++++++ .../Classes/Public/GDLRegistrar.h | 49 +++++++++++++++++++ GoogleDataLogger/Tests/GDLRegistrarTest.m | 32 ++++++++++++ 6 files changed, 222 insertions(+) create mode 100644 GoogleDataLogger/GoogleDataLogger/Classes/GDLRegistrar.m create mode 100644 GoogleDataLogger/GoogleDataLogger/Classes/Private/GDLRegistrar_Private.h create mode 100644 GoogleDataLogger/GoogleDataLogger/Classes/Public/GDLLogBackend.h create mode 100644 GoogleDataLogger/GoogleDataLogger/Classes/Public/GDLLogScorer.h create mode 100644 GoogleDataLogger/GoogleDataLogger/Classes/Public/GDLRegistrar.h create mode 100644 GoogleDataLogger/Tests/GDLRegistrarTest.m diff --git a/GoogleDataLogger/GoogleDataLogger/Classes/GDLRegistrar.m b/GoogleDataLogger/GoogleDataLogger/Classes/GDLRegistrar.m new file mode 100644 index 00000000000..48e0b257d52 --- /dev/null +++ b/GoogleDataLogger/GoogleDataLogger/Classes/GDLRegistrar.m @@ -0,0 +1,28 @@ +/* + * Copyright 2018 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "GDLRegistrar.h" + +@implementation GDLRegistrar + ++ (instancetype)sharedInstance { + return nil; +} + +- (void)registerBackend:(id)backend forLogTarget:(NSInteger)logTarget { +} + +@end diff --git a/GoogleDataLogger/GoogleDataLogger/Classes/Private/GDLRegistrar_Private.h b/GoogleDataLogger/GoogleDataLogger/Classes/Private/GDLRegistrar_Private.h new file mode 100644 index 00000000000..d6a8ee2eb93 --- /dev/null +++ b/GoogleDataLogger/GoogleDataLogger/Classes/Private/GDLRegistrar_Private.h @@ -0,0 +1,28 @@ +/* + * Copyright 2018 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import + +@interface GDLRegistrar () + +/** */ +- (id)backendForLogTarget:(NSInteger)logTarget; + +/** */ +- (id)scorerForLogTarger:(NSInteger) + logTarget: + + @end diff --git a/GoogleDataLogger/GoogleDataLogger/Classes/Public/GDLLogBackend.h b/GoogleDataLogger/GoogleDataLogger/Classes/Public/GDLLogBackend.h new file mode 100644 index 00000000000..8c17ec57a65 --- /dev/null +++ b/GoogleDataLogger/GoogleDataLogger/Classes/Public/GDLLogBackend.h @@ -0,0 +1,39 @@ +/* + * Copyright 2018 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import + +/** A convenient typedef to define the block to be called upon completion of an upload to the + * backend. + */ +typedef void (^GDLBackendCompletionBlock)(NSSet *successfulUploads, + NSSet *unsuccessfulUploads); + +/** This protocol defines the common interface for logging backend implementations. */ +@protocol GDLLogBackend + +@required + +/** Uploads logs to the backend using this specific backend's chosen format. + * + * @param logFiles The set of log files to upload. + * @param onComplete A block to invoke upon completing the upload. Has two arguments: + * - successfulUploads: The set of filenames uploaded successfully. + * - unsuccessfulUploads: The set of filenames not uploaded successfully. + */ +- (void)uploadLogs:(NSSet *)logFiles onComplete:(GDLBackendCompletionBlock)onComplete; + +@end diff --git a/GoogleDataLogger/GoogleDataLogger/Classes/Public/GDLLogScorer.h b/GoogleDataLogger/GoogleDataLogger/Classes/Public/GDLLogScorer.h new file mode 100644 index 00000000000..47e8384245b --- /dev/null +++ b/GoogleDataLogger/GoogleDataLogger/Classes/Public/GDLLogScorer.h @@ -0,0 +1,46 @@ +/* + * Copyright 2018 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import + +@class GDLLogEvent; + +/** This protocol defines the common interface of a log scorer. Log scorers are stateful objects + * that score logs upon insertion into storage and remain prepared to return a set of log filenames + *to the storage system + **/ +@protocol GDLLogScorer + +@required + +/** Accepts a logEvent and uses the log metadata to make choices on how to prioritize the log. This + * method exists as a way to help prioritize which logs should be sent, which is dependent on the + * request proto structure of your backend. + * + * @note the logEvent cannot be retained for longer than the execution time of this method. Also, + * extension should be nil by this point and should not be used to prioritize logs. + * + * @param logEvent The log event to score. + */ +- (NSInteger)scoreLog:(GDLLogEvent *)logEvent; + +/** Returns a set of logs based on the prioritization logic of the scorer. + * + * @return A set of logs to upload, presumably based on the logs' priority. + */ +- (NSSet *)logsForNextUpload; + +@end diff --git a/GoogleDataLogger/GoogleDataLogger/Classes/Public/GDLRegistrar.h b/GoogleDataLogger/GoogleDataLogger/Classes/Public/GDLRegistrar.h new file mode 100644 index 00000000000..c9c5f3057a4 --- /dev/null +++ b/GoogleDataLogger/GoogleDataLogger/Classes/Public/GDLRegistrar.h @@ -0,0 +1,49 @@ +/* + * Copyright 2018 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import + +#import +#import + +NS_ASSUME_NONNULL_BEGIN + +/** Manages the registration of log targets with the logging SDK. */ +@interface GDLRegistrar : NSObject + +/** Creates and/or returns the singleton instance. + * + * @return The singleton instance of this class. + */ ++ (instancetype)sharedInstance; + +/** Registers a backend implementation with the GoogleDataLogger infrastructure. + * + * @param backend The backend object to register. + * @param logTarget The logTarget this backend object will be responsible for. + */ +- (void)registerBackend:(id)backend forLogTarget:(NSInteger)logTarget; + +/** Registers a log scorer implementation with the GoogleDataLogger infrastructure. + * + * @param scorer The scorer object to register. + * @param logTarget The logTarget this scorer objet will be responsible for. + */ +- (void)registerLogScorer:(id)scorer forLogTarget:(NSInteger)logTarget; + +@end + +NS_ASSUME_NONNULL_END diff --git a/GoogleDataLogger/Tests/GDLRegistrarTest.m b/GoogleDataLogger/Tests/GDLRegistrarTest.m new file mode 100644 index 00000000000..d2f5727f67d --- /dev/null +++ b/GoogleDataLogger/Tests/GDLRegistrarTest.m @@ -0,0 +1,32 @@ +/* + * Copyright 2018 Google + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import + +#import + +@interface GDLRegistrarTest : XCTestCase + +@end + +@implementation GDLRegistrarTest + +/** Tests the default initializer. */ +- (void)testInit { + XCTAssertNotNil([[GDLRegistrarTest alloc] init]); +} + +@end From be627acc837f7ffba9dea243f6032e2e8bfad76f Mon Sep 17 00:00:00 2001 From: Michael Haney Date: Wed, 19 Dec 2018 01:24:36 -0800 Subject: [PATCH 3/6] Docs and slight changes to the scorer API. --- .../GoogleDataLogger/Classes/GDLRegistrar.m | 11 ++++++++++- .../Classes/Private/GDLRegistrar_Private.h | 11 +++++------ .../GoogleDataLogger/Classes/Public/GDLLogScorer.h | 11 ++++++----- 3 files changed, 21 insertions(+), 12 deletions(-) diff --git a/GoogleDataLogger/GoogleDataLogger/Classes/GDLRegistrar.m b/GoogleDataLogger/GoogleDataLogger/Classes/GDLRegistrar.m index 48e0b257d52..3fcc0ac6a2f 100644 --- a/GoogleDataLogger/GoogleDataLogger/Classes/GDLRegistrar.m +++ b/GoogleDataLogger/GoogleDataLogger/Classes/GDLRegistrar.m @@ -19,10 +19,19 @@ @implementation GDLRegistrar + (instancetype)sharedInstance { - return nil; + static GDLRegistrar *sharedInstance; + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + sharedInstance = [[GDLRegistrar alloc] init]; + }); } - (void)registerBackend:(id)backend forLogTarget:(NSInteger)logTarget { + // TODO +} + +- (void)registerLogScorer:(id)scorer forLogTarget:(NSInteger)logTarget { + // TODO } @end diff --git a/GoogleDataLogger/GoogleDataLogger/Classes/Private/GDLRegistrar_Private.h b/GoogleDataLogger/GoogleDataLogger/Classes/Private/GDLRegistrar_Private.h index d6a8ee2eb93..cb862957607 100644 --- a/GoogleDataLogger/GoogleDataLogger/Classes/Private/GDLRegistrar_Private.h +++ b/GoogleDataLogger/GoogleDataLogger/Classes/Private/GDLRegistrar_Private.h @@ -18,11 +18,10 @@ @interface GDLRegistrar () -/** */ -- (id)backendForLogTarget:(NSInteger)logTarget; +/** A map of logTargets to backend implementations. */ +@property(nonatomic) NSDictionary> *logTargetToBackend; -/** */ -- (id)scorerForLogTarger:(NSInteger) - logTarget: +/** A map of logTargets to scorer implementations. */ +@property(nonatomic) NSDictionary> *logTargetToScorer; - @end +@end diff --git a/GoogleDataLogger/GoogleDataLogger/Classes/Public/GDLLogScorer.h b/GoogleDataLogger/GoogleDataLogger/Classes/Public/GDLLogScorer.h index 47e8384245b..eed7406d25c 100644 --- a/GoogleDataLogger/GoogleDataLogger/Classes/Public/GDLLogScorer.h +++ b/GoogleDataLogger/GoogleDataLogger/Classes/Public/GDLLogScorer.h @@ -30,17 +30,18 @@ * method exists as a way to help prioritize which logs should be sent, which is dependent on the * request proto structure of your backend. * - * @note the logEvent cannot be retained for longer than the execution time of this method. Also, - * extension should be nil by this point and should not be used to prioritize logs. + * @note Three things: 1. the logEvent cannot be retained for longer than the execution time of + * this method. 2. The extension should be nil by this point and should not be used to prioritize + * logs. 3. You should retain the logEvent hashes, because those are returned in logsForNextUpload. * * @param logEvent The log event to score. */ -- (NSInteger)scoreLog:(GDLLogEvent *)logEvent; +- (void)scoreLog:(GDLLogEvent *)logEvent; /** Returns a set of logs based on the prioritization logic of the scorer. * - * @return A set of logs to upload, presumably based on the logs' priority. + * @return A set of log hashes to upload, presumably based on the logs' priority. */ -- (NSSet *)logsForNextUpload; +- (NSSet *)logsForNextUpload; @end From 4a6697aa83cb47e2824df922fd928619e96d3b6e Mon Sep 17 00:00:00 2001 From: Michael Haney Date: Wed, 19 Dec 2018 01:26:49 -0800 Subject: [PATCH 4/6] Missing return statement --- GoogleDataLogger/GoogleDataLogger/Classes/GDLRegistrar.m | 1 + 1 file changed, 1 insertion(+) diff --git a/GoogleDataLogger/GoogleDataLogger/Classes/GDLRegistrar.m b/GoogleDataLogger/GoogleDataLogger/Classes/GDLRegistrar.m index 3fcc0ac6a2f..2d02ccd0fbe 100644 --- a/GoogleDataLogger/GoogleDataLogger/Classes/GDLRegistrar.m +++ b/GoogleDataLogger/GoogleDataLogger/Classes/GDLRegistrar.m @@ -24,6 +24,7 @@ + (instancetype)sharedInstance { dispatch_once(&onceToken, ^{ sharedInstance = [[GDLRegistrar alloc] init]; }); + return sharedInstance; } - (void)registerBackend:(id)backend forLogTarget:(NSInteger)logTarget { From e07ff5ab269fd974d6381e1737e31ea137574d72 Mon Sep 17 00:00:00 2001 From: Michael Haney Date: Wed, 19 Dec 2018 14:21:25 -0800 Subject: [PATCH 5/6] Change 'score' terminology to 'prioritize'. Also style issues. --- .../GoogleDataLogger/Classes/GDLRegistrar.m | 3 ++- .../Classes/Private/GDLRegistrar_Private.h | 4 ++-- .../{GDLLogScorer.h => GDLLogPrioritizer.h} | 16 ++++++++-------- .../Classes/Public/GDLRegistrar.h | 10 +++++----- 4 files changed, 17 insertions(+), 16 deletions(-) rename GoogleDataLogger/GoogleDataLogger/Classes/Public/{GDLLogScorer.h => GDLLogPrioritizer.h} (75%) diff --git a/GoogleDataLogger/GoogleDataLogger/Classes/GDLRegistrar.m b/GoogleDataLogger/GoogleDataLogger/Classes/GDLRegistrar.m index 2d02ccd0fbe..8520dbfd17f 100644 --- a/GoogleDataLogger/GoogleDataLogger/Classes/GDLRegistrar.m +++ b/GoogleDataLogger/GoogleDataLogger/Classes/GDLRegistrar.m @@ -31,7 +31,8 @@ - (void)registerBackend:(id)backend forLogTarget:(NSInteger)logTa // TODO } -- (void)registerLogScorer:(id)scorer forLogTarget:(NSInteger)logTarget { +- (void)registerLogPrioritizer:(id)prioritizer + forLogTarget:(NSInteger)logTarget { // TODO } diff --git a/GoogleDataLogger/GoogleDataLogger/Classes/Private/GDLRegistrar_Private.h b/GoogleDataLogger/GoogleDataLogger/Classes/Private/GDLRegistrar_Private.h index cb862957607..182360f9541 100644 --- a/GoogleDataLogger/GoogleDataLogger/Classes/Private/GDLRegistrar_Private.h +++ b/GoogleDataLogger/GoogleDataLogger/Classes/Private/GDLRegistrar_Private.h @@ -21,7 +21,7 @@ /** A map of logTargets to backend implementations. */ @property(nonatomic) NSDictionary> *logTargetToBackend; -/** A map of logTargets to scorer implementations. */ -@property(nonatomic) NSDictionary> *logTargetToScorer; +/** A map of logTargets to prioritizer implementations. */ +@property(nonatomic) NSDictionary> *logTargetToPrioritizer; @end diff --git a/GoogleDataLogger/GoogleDataLogger/Classes/Public/GDLLogScorer.h b/GoogleDataLogger/GoogleDataLogger/Classes/Public/GDLLogPrioritizer.h similarity index 75% rename from GoogleDataLogger/GoogleDataLogger/Classes/Public/GDLLogScorer.h rename to GoogleDataLogger/GoogleDataLogger/Classes/Public/GDLLogPrioritizer.h index eed7406d25c..1cb547479ad 100644 --- a/GoogleDataLogger/GoogleDataLogger/Classes/Public/GDLLogScorer.h +++ b/GoogleDataLogger/GoogleDataLogger/Classes/Public/GDLLogPrioritizer.h @@ -18,11 +18,11 @@ @class GDLLogEvent; -/** This protocol defines the common interface of a log scorer. Log scorers are stateful objects - * that score logs upon insertion into storage and remain prepared to return a set of log filenames - *to the storage system - **/ -@protocol GDLLogScorer +/** This protocol defines the common interface of a log prioritization. Log prioritizers are + * stateful objects that prioritize logs upon insertion into storage and remain prepared to return a + * set of log filenames to the storage system. + */ +@protocol GDLLogPrioritizer @required @@ -34,11 +34,11 @@ * this method. 2. The extension should be nil by this point and should not be used to prioritize * logs. 3. You should retain the logEvent hashes, because those are returned in logsForNextUpload. * - * @param logEvent The log event to score. + * @param logEvent The log event to prioritize. */ -- (void)scoreLog:(GDLLogEvent *)logEvent; +- (void)prioritizeLog:(GDLLogEvent *)logEvent; -/** Returns a set of logs based on the prioritization logic of the scorer. +/** Returns a set of logs based on the logic of the prioritizer. * * @return A set of log hashes to upload, presumably based on the logs' priority. */ diff --git a/GoogleDataLogger/GoogleDataLogger/Classes/Public/GDLRegistrar.h b/GoogleDataLogger/GoogleDataLogger/Classes/Public/GDLRegistrar.h index c9c5f3057a4..d16e47714dc 100644 --- a/GoogleDataLogger/GoogleDataLogger/Classes/Public/GDLRegistrar.h +++ b/GoogleDataLogger/GoogleDataLogger/Classes/Public/GDLRegistrar.h @@ -17,7 +17,7 @@ #import #import -#import +#import NS_ASSUME_NONNULL_BEGIN @@ -37,12 +37,12 @@ NS_ASSUME_NONNULL_BEGIN */ - (void)registerBackend:(id)backend forLogTarget:(NSInteger)logTarget; -/** Registers a log scorer implementation with the GoogleDataLogger infrastructure. +/** Registers a log prioritizer implementation with the GoogleDataLogger infrastructure. * - * @param scorer The scorer object to register. - * @param logTarget The logTarget this scorer objet will be responsible for. + * @param prioritizer The prioritizer object to register. + * @param logTarget The logTarget this prioritizer object will be responsible for. */ -- (void)registerLogScorer:(id)scorer forLogTarget:(NSInteger)logTarget; +- (void)registerLogPrioritizer:(id)prioritizer forLogTarget:(NSInteger)logTarget; @end From 2a72159ea076c2c5a859c18ba0db28d18b64dfba Mon Sep 17 00:00:00 2001 From: Michael Haney Date: Wed, 19 Dec 2018 14:40:02 -0800 Subject: [PATCH 6/6] Change the protocol being used for a prioritizer. --- .../GoogleDataLogger/Classes/Private/GDLRegistrar_Private.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/GoogleDataLogger/GoogleDataLogger/Classes/Private/GDLRegistrar_Private.h b/GoogleDataLogger/GoogleDataLogger/Classes/Private/GDLRegistrar_Private.h index 182360f9541..0ee36e16a61 100644 --- a/GoogleDataLogger/GoogleDataLogger/Classes/Private/GDLRegistrar_Private.h +++ b/GoogleDataLogger/GoogleDataLogger/Classes/Private/GDLRegistrar_Private.h @@ -22,6 +22,6 @@ @property(nonatomic) NSDictionary> *logTargetToBackend; /** A map of logTargets to prioritizer implementations. */ -@property(nonatomic) NSDictionary> *logTargetToPrioritizer; +@property(nonatomic) NSDictionary> *logTargetToPrioritizer; @end