Skip to content

Commit 2497c8b

Browse files
Add better, more flexible APIs for SDK initialization.
Our current SDK initialization is lackluster in that it's split across multiple classes, files, and method calls. This PR hopes to unify some of these initialization settings int o a single 'configuration' class that can be easily used to intialize parse in a much cleaner way, especially as we add even more initialization options.
1 parent 5863a69 commit 2497c8b

9 files changed

+238
-83
lines changed

Parse.xcodeproj/project.pbxproj

+20
Original file line numberDiff line numberDiff line change
@@ -1546,6 +1546,14 @@
15461546
F5B0C4F51BA248F7000AB0D5 /* PFFileDataStream.h in Headers */ = {isa = PBXBuildFile; fileRef = F5B0C4F21BA248F7000AB0D5 /* PFFileDataStream.h */; };
15471547
F5B0C4F61BA248F7000AB0D5 /* PFFileDataStream.m in Sources */ = {isa = PBXBuildFile; fileRef = F5B0C4F31BA248F7000AB0D5 /* PFFileDataStream.m */; };
15481548
F5B0C4F71BA248F7000AB0D5 /* PFFileDataStream.m in Sources */ = {isa = PBXBuildFile; fileRef = F5B0C4F31BA248F7000AB0D5 /* PFFileDataStream.m */; };
1549+
F5B64D8B1BFA646C0038F3CB /* ParseClientConfiguration.h in Headers */ = {isa = PBXBuildFile; fileRef = F5B64D891BFA646C0038F3CB /* ParseClientConfiguration.h */; settings = {ATTRIBUTES = (Public, ); }; };
1550+
F5B64D8C1BFA646C0038F3CB /* ParseClientConfiguration.h in Headers */ = {isa = PBXBuildFile; fileRef = F5B64D891BFA646C0038F3CB /* ParseClientConfiguration.h */; settings = {ATTRIBUTES = (Public, ); }; };
1551+
F5B64D8D1BFA646C0038F3CB /* ParseClientConfiguration.h in Headers */ = {isa = PBXBuildFile; fileRef = F5B64D891BFA646C0038F3CB /* ParseClientConfiguration.h */; settings = {ATTRIBUTES = (Public, ); }; };
1552+
F5B64D8E1BFA646C0038F3CB /* ParseClientConfiguration.h in Headers */ = {isa = PBXBuildFile; fileRef = F5B64D891BFA646C0038F3CB /* ParseClientConfiguration.h */; settings = {ATTRIBUTES = (Public, ); }; };
1553+
F5B64D8F1BFA646C0038F3CB /* ParseClientConfiguration.m in Sources */ = {isa = PBXBuildFile; fileRef = F5B64D8A1BFA646C0038F3CB /* ParseClientConfiguration.m */; };
1554+
F5B64D901BFA646C0038F3CB /* ParseClientConfiguration.m in Sources */ = {isa = PBXBuildFile; fileRef = F5B64D8A1BFA646C0038F3CB /* ParseClientConfiguration.m */; };
1555+
F5B64D911BFA646C0038F3CB /* ParseClientConfiguration.m in Sources */ = {isa = PBXBuildFile; fileRef = F5B64D8A1BFA646C0038F3CB /* ParseClientConfiguration.m */; };
1556+
F5B64D921BFA646C0038F3CB /* ParseClientConfiguration.m in Sources */ = {isa = PBXBuildFile; fileRef = F5B64D8A1BFA646C0038F3CB /* ParseClientConfiguration.m */; };
15491557
F5C42CC71B34C22100C720D8 /* AudioToolbox.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 095ACE9913C69BF700566243 /* AudioToolbox.framework */; };
15501558
F5C42CD41B34F68C00C720D8 /* PFObjectSubclassingController.h in Headers */ = {isa = PBXBuildFile; fileRef = F5C42CD21B34F68C00C720D8 /* PFObjectSubclassingController.h */; };
15511559
F5C42CD51B34F68C00C720D8 /* PFObjectSubclassingController.h in Headers */ = {isa = PBXBuildFile; fileRef = F5C42CD21B34F68C00C720D8 /* PFObjectSubclassingController.h */; };
@@ -2215,6 +2223,8 @@
22152223
F5B0B3141B44A21100F3EBC4 /* SystemConfiguration.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = SystemConfiguration.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS8.4.sdk/System/Library/Frameworks/SystemConfiguration.framework; sourceTree = DEVELOPER_DIR; };
22162224
F5B0C4F21BA248F7000AB0D5 /* PFFileDataStream.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PFFileDataStream.h; sourceTree = "<group>"; };
22172225
F5B0C4F31BA248F7000AB0D5 /* PFFileDataStream.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = PFFileDataStream.m; sourceTree = "<group>"; };
2226+
F5B64D891BFA646C0038F3CB /* ParseClientConfiguration.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ParseClientConfiguration.h; sourceTree = "<group>"; };
2227+
F5B64D8A1BFA646C0038F3CB /* ParseClientConfiguration.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ParseClientConfiguration.m; sourceTree = "<group>"; };
22182228
F5C42CD21B34F68C00C720D8 /* PFObjectSubclassingController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PFObjectSubclassingController.h; sourceTree = "<group>"; };
22192229
F5C42CD31B34F68C00C720D8 /* PFObjectSubclassingController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = PFObjectSubclassingController.m; sourceTree = "<group>"; };
22202230
F5C42CD81B38761B00C720D8 /* PFObjectSubclassInfo.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PFObjectSubclassInfo.h; sourceTree = "<group>"; };
@@ -2302,6 +2312,8 @@
23022312
09809FB81434F98C00EC3E74 /* Resources */,
23032313
09EEA12D1434FB1F00E3A3FA /* Parse.h */,
23042314
09EEA12E1434FB1F00E3A3FA /* Parse.m */,
2315+
F5B64D891BFA646C0038F3CB /* ParseClientConfiguration.h */,
2316+
F5B64D8A1BFA646C0038F3CB /* ParseClientConfiguration.m */,
23052317
64C47802147336C70092082F /* PFACL.h */,
23062318
64C47803147336C70092082F /* PFACL.m */,
23072319
9739513816B9D28E0010B884 /* PFAnalytics.h */,
@@ -4002,6 +4014,7 @@
40024014
810156501BB3832700D7C7BD /* PFSubclassing.h in Headers */,
40034015
810156511BB3832700D7C7BD /* PFObjectBatchController.h in Headers */,
40044016
810156521BB3832700D7C7BD /* PFAnalyticsUtilities.h in Headers */,
4017+
F5B64D8E1BFA646C0038F3CB /* ParseClientConfiguration.h in Headers */,
40054018
810156531BB3832700D7C7BD /* PFObject+Subclass.h in Headers */,
40064019
810156541BB3832700D7C7BD /* PFUserState_Private.h in Headers */,
40074020
810156551BB3832700D7C7BD /* PFAnonymousAuthenticationProvider.h in Headers */,
@@ -4206,6 +4219,7 @@
42064219
815F24091BD04D150054659F /* PFOfflineQueryController.h in Headers */,
42074220
815F240A1BD04D150054659F /* PFUser.h in Headers */,
42084221
815F240B1BD04D150054659F /* PFSQLiteDatabase_Private.h in Headers */,
4222+
F5B64D8D1BFA646C0038F3CB /* ParseClientConfiguration.h in Headers */,
42094223
815F240C1BD04D150054659F /* PFACLState.h in Headers */,
42104224
815F240D1BD04D150054659F /* PFCurrentConfigController.h in Headers */,
42114225
);
@@ -4219,6 +4233,7 @@
42194233
810B7D761A0291FF003C0909 /* PFMacros.h in Headers */,
42204234
815E764D1BDF168A00E1DF8E /* PFPersistenceController.h in Headers */,
42214235
81BBE1351A0062B800622646 /* PFRESTAnalyticsCommand.h in Headers */,
4236+
F5B64D8B1BFA646C0038F3CB /* ParseClientConfiguration.h in Headers */,
42224237
F5B0C4F41BA248F7000AB0D5 /* PFFileDataStream.h in Headers */,
42234238
81CB7FA01B1800E400DC601D /* PFPushController.h in Headers */,
42244239
815EE93C19FA56D20076FE5D /* PFHTTPURLRequestConstructor.h in Headers */,
@@ -4604,6 +4619,7 @@
46044619
F5556A191B66F47900410837 /* PFURLSession_Private.h in Headers */,
46054620
8148815A1B795CAC008763BF /* PFPropertyInfo_Private.h in Headers */,
46064621
81C9C9F819FEA89200D514C5 /* PFRESTPushCommand.h in Headers */,
4622+
F5B64D8C1BFA646C0038F3CB /* ParseClientConfiguration.h in Headers */,
46074623
81C7F49A1AF42187007B5418 /* PFFileState.h in Headers */,
46084624
81CB7F761B166FF500DC601D /* PFMutableObjectState.h in Headers */,
46094625
8166FCC51B503886003841A2 /* PFSQLiteStatement.h in Headers */,
@@ -5043,6 +5059,7 @@
50435059
810155371BB3832700D7C7BD /* PFFileStagingController.m in Sources */,
50445060
810155381BB3832700D7C7BD /* PFSQLiteDatabaseController.m in Sources */,
50455061
815E76541BDF168A00E1DF8E /* PFPersistenceController.m in Sources */,
5062+
F5B64D921BFA646C0038F3CB /* ParseClientConfiguration.m in Sources */,
50465063
810155391BB3832700D7C7BD /* PFFileManager.m in Sources */,
50475064
8101553B1BB3832700D7C7BD /* PFPinningEventuallyQueue.m in Sources */,
50485065
8101553C1BB3832700D7C7BD /* PFRESTQueryCommand.m in Sources */,
@@ -5248,6 +5265,7 @@
52485265
815F23261BD04D150054659F /* PFHTTPURLRequestConstructor.m in Sources */,
52495266
815F23271BD04D150054659F /* PFObjectUtilities.m in Sources */,
52505267
815F23281BD04D150054659F /* PFURLSessionJSONDataTaskDelegate.m in Sources */,
5268+
F5B64D911BFA646C0038F3CB /* ParseClientConfiguration.m in Sources */,
52515269
815F23291BD04D150054659F /* PFObjectEstimatedData.m in Sources */,
52525270
815F232A1BD04D150054659F /* PFConfig.m in Sources */,
52535271
815F232B1BD04D150054659F /* PFMultiProcessFileLockController.m in Sources */,
@@ -5540,6 +5558,7 @@
55405558
8166FC751B50376D003841A2 /* PFObjectController.m in Sources */,
55415559
81C3826A19CCAD7F0066284A /* PFCategoryLoader.m in Sources */,
55425560
8166FCDB1B503914003841A2 /* PFUserAuthenticationController.m in Sources */,
5561+
F5B64D8F1BFA646C0038F3CB /* ParseClientConfiguration.m in Sources */,
55435562
F5E8DE1B1B29100000EEA594 /* PFRelationState.m in Sources */,
55445563
8127148A1AE6F1270076AE8D /* ParseManager.m in Sources */,
55455564
81CB7F901B1795C000DC601D /* PFPushState.m in Sources */,
@@ -5692,6 +5711,7 @@
56925711
8166FC661B50375D003841A2 /* PFOperationSet.m in Sources */,
56935712
81C7F4B31AF42BD9007B5418 /* PFQueryState.m in Sources */,
56945713
81BF4ABF1B0BF64B00A3D75B /* PFCurrentConfigController.m in Sources */,
5714+
F5B64D901BFA646C0038F3CB /* ParseClientConfiguration.m in Sources */,
56955715
811214761B3E1CF10052741B /* PFObjectBatchController.m in Sources */,
56965716
81986CA51A412277007B8860 /* PFApplication.m in Sources */,
56975717
81A715A71B423A4100A504FC /* PFObjectUtilities.m in Sources */,

Parse/Internal/ParseManager.h

+4-20
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99

1010
#import <Foundation/Foundation.h>
1111

12+
#import <Parse/ParseClientConfiguration.h>
1213
#import <Parse/PFConstants.h>
1314

1415
#import "PFDataProvider.h"
@@ -32,11 +33,7 @@ PFKeychainStoreProvider,
3233
PFKeyValueCacheProvider,
3334
PFInstallationIdentifierStoreProvider>
3435

35-
@property (nonatomic, copy, readonly) NSString *applicationId;
36-
@property (nonatomic, copy, readonly) NSString *clientKey;
37-
38-
@property (nonatomic, copy, readonly) NSString *applicationGroupIdentifier;
39-
@property (nonatomic, copy, readonly) NSString *containingApplicationIdentifier;
36+
@property (nonatomic, copy, readonly) ParseClientConfiguration *configuration;
4037

4138
@property (nonatomic, strong, readonly) PFCoreManager *coreManager;
4239

@@ -59,24 +56,11 @@ PFInstallationIdentifierStoreProvider>
5956
/*!
6057
Initializes an instance of ParseManager class.
6158
62-
@param applicationId ApplicationId of Parse app.
63-
@param clientKey ClientKey of Parse app.
59+
@param configuration Configuration of parse app.
6460
6561
@returns `ParseManager` instance.
6662
*/
67-
- (instancetype)initWithApplicationId:(NSString *)applicationId
68-
clientKey:(NSString *)clientKey NS_DESIGNATED_INITIALIZER;
69-
70-
/*!
71-
Configures ParseManager with specified properties.
72-
73-
@param applicationGroupIdentifier Shared AppGroup container identifier.
74-
@param containingApplicationIdentifier Containg application bundle identifier (for extensions).
75-
@param localDataStoreEnabled `BOOL` flag to enable local datastore or not.
76-
*/
77-
- (void)configureWithApplicationGroupIdentifier:(NSString *)applicationGroupIdentifier
78-
containingApplicationIdentifier:(NSString *)containingApplicationIdentifier
79-
enabledLocalDataStore:(BOOL)localDataStoreEnabled;
63+
- (instancetype)initWithConfiguration:(ParseClientConfiguration *)configuration;
8064

8165
///--------------------------------------
8266
/// @name Offline Store

Parse/Internal/ParseManager.m

+17-25
Original file line numberDiff line numberDiff line change
@@ -86,7 +86,7 @@ - (instancetype)init {
8686
PFNotDesignatedInitializer();
8787
}
8888

89-
- (instancetype)initWithApplicationId:(NSString *)applicationId clientKey:(NSString *)clientKey {
89+
- (instancetype)initWithConfiguration:(ParseClientConfiguration *)configuration {
9090
self = [super init];
9191
if (!self) return nil;
9292

@@ -104,38 +104,30 @@ - (instancetype)initWithApplicationId:(NSString *)applicationId clientKey:(NSStr
104104
_controllerAccessQueue = dispatch_queue_create("com.parse.controller.access", DISPATCH_QUEUE_SERIAL);
105105
_preloadQueue = dispatch_queue_create("com.parse.preload", DISPATCH_QUEUE_SERIAL);
106106

107-
_applicationId = [applicationId copy];
108-
_clientKey = [clientKey copy];
109-
110-
return self;
111-
}
112-
113-
- (void)configureWithApplicationGroupIdentifier:(NSString *)applicationGroupIdentifier
114-
containingApplicationIdentifier:(NSString *)containingApplicationIdentifier
115-
enabledLocalDataStore:(BOOL)localDataStoreEnabled {
116-
_applicationGroupIdentifier = [applicationGroupIdentifier copy];
117-
_containingApplicationIdentifier = [containingApplicationIdentifier copy];
107+
_configuration = [configuration copy];
118108

119109
// Migrate any data if it's required.
120110
[self _migrateSandboxDataToApplicationGroupContainerIfNeeded];
121111

122112
// TODO: (nlutsenko) Make it not terrible!
123113
[[self.persistenceController getPersistenceGroupAsync] waitForResult:nil withMainThreadWarning:NO];
124114

125-
if (localDataStoreEnabled) {
126-
PFOfflineStoreOptions options = (_applicationGroupIdentifier ?
115+
if (_configuration.localDatastoreEnabled) {
116+
PFOfflineStoreOptions options = (_configuration.applicationGroupIdentifier ?
127117
PFOfflineStoreOptionAlwaysFetchFromSQLite : 0);
128118
[self loadOfflineStoreWithOptions:options];
129119
}
120+
121+
return self;
130122
}
131123

132124
///--------------------------------------
133125
#pragma mark - Offline Store
134126
///--------------------------------------
135127

136128
- (void)loadOfflineStoreWithOptions:(PFOfflineStoreOptions)options {
137-
PFConsistencyAssert(!_offlineStore, @"Can't load offline store more than once.");
138129
dispatch_barrier_sync(_offlineStoreAccessQueue, ^{
130+
PFConsistencyAssert(!_offlineStore, @"Can't load offline store more than once.");
139131
_offlineStore = [[PFOfflineStore alloc] initWithFileManager:self.fileManager options:options];
140132
});
141133
}
@@ -218,7 +210,7 @@ - (PFKeychainStore *)keychainStore {
218210
__block PFKeychainStore *store = nil;
219211
dispatch_sync(_keychainStoreAccessQueue, ^{
220212
if (!_keychainStore) {
221-
NSString *bundleIdentifier = (_containingApplicationIdentifier ?: [[NSBundle mainBundle] bundleIdentifier]);
213+
NSString *bundleIdentifier = (self.configuration.containingApplicationBundleIdentifier ?: [[NSBundle mainBundle] bundleIdentifier]);
222214
NSString *service = [NSString stringWithFormat:@"%@.%@", bundleIdentifier, PFKeychainStoreDefaultService];
223215
_keychainStore = [[PFKeychainStore alloc] initWithService:service];
224216
}
@@ -233,8 +225,8 @@ - (PFFileManager *)fileManager {
233225
__block PFFileManager *fileManager = nil;
234226
dispatch_sync(_fileManagerAccessQueue, ^{
235227
if (!_fileManager) {
236-
_fileManager = [[PFFileManager alloc] initWithApplicationIdentifier:self.applicationId
237-
applicationGroupIdentifier:self.applicationGroupIdentifier];
228+
_fileManager = [[PFFileManager alloc] initWithApplicationIdentifier:self.configuration.applicationId
229+
applicationGroupIdentifier:self.configuration.applicationGroupIdentifier];
238230
}
239231
fileManager = _fileManager;
240232
});
@@ -270,7 +262,7 @@ - (PFPersistenceController *)_createPersistenceController {
270262
return [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
271263
}] continueWithSuccessBlock:^id(BFTask *task) {
272264
if (task.result) {
273-
if ([self.applicationId isEqualToString:task.result]) {
265+
if ([self.configuration.applicationId isEqualToString:task.result]) {
274266
// Everything is valid, no need to remove, set applicationId here.
275267
return nil;
276268
}
@@ -279,15 +271,15 @@ - (PFPersistenceController *)_createPersistenceController {
279271
[self.keyValueCache removeAllObjects];
280272
}
281273
return [[group removeAllDataAsync] continueWithSuccessBlock:^id(BFTask *task) {
282-
NSData *applicationIdData = [self.applicationId dataUsingEncoding:NSUTF8StringEncoding];
274+
NSData *applicationIdData = [self.configuration.applicationId dataUsingEncoding:NSUTF8StringEncoding];
283275
return [group setDataAsync:applicationIdData forKey:_ParseApplicationIdFileName];
284276
}];
285277
}] continueWithBlock:^id(BFTask *task) {
286278
return [group endLockedContentAccessAsyncToDataForKey:_ParseApplicationIdFileName];
287279
}];
288280
};
289-
return [[PFPersistenceController alloc] initWithApplicationIdentifier:self.applicationId
290-
applicationGroupIdentifier:self.applicationGroupIdentifier
281+
return [[PFPersistenceController alloc] initWithApplicationIdentifier:self.configuration.applicationId
282+
applicationGroupIdentifier:self.configuration.applicationGroupIdentifier
291283
groupValidationHandler:validationHandler];
292284
}
293285

@@ -311,8 +303,8 @@ - (PFInstallationIdentifierStore *)installationIdentifierStore {
311303
dispatch_sync(_commandRunnerAccessQueue, ^{
312304
if (!_commandRunner) {
313305
_commandRunner = [PFURLSessionCommandRunner commandRunnerWithDataSource:self
314-
applicationId:self.applicationId
315-
clientKey:self.clientKey];
306+
applicationId:self.configuration.applicationId
307+
clientKey:self.configuration.clientKey];
316308
}
317309
runner = _commandRunner;
318310
});
@@ -447,7 +439,7 @@ - (void)_migrateSandboxDataToApplicationGroupContainerIfNeeded {
447439
// There is no need to migrate anything on OSX, since we are using globally available folder.
448440
#if TARGET_OS_IOS
449441
// Do nothing if there is no application group container or containing application is specified.
450-
if (!self.applicationGroupIdentifier || self.containingApplicationIdentifier) {
442+
if (!self.configuration.applicationGroupIdentifier || self.configuration.containingApplicationBundleIdentifier) {
451443
return;
452444
}
453445

Parse/Parse.h

+17
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99

1010
#import <Foundation/Foundation.h>
1111

12+
#import <Parse/ParseClientConfiguration.h>
1213
#import <Parse/PFACL.h>
1314
#import <Parse/PFAnalytics.h>
1415
#import <Parse/PFAnonymousUtils.h>
@@ -66,6 +67,22 @@ NS_ASSUME_NONNULL_BEGIN
6667
*/
6768
+ (void)setApplicationId:(NSString *)applicationId clientKey:(NSString *)clientKey;
6869

70+
/*!
71+
@abstract Sets the configuration to be used for parse.
72+
73+
@note Re-setting the configuration after having previously sent requests through the SDK results in undefined behavior.
74+
75+
@param configuration The new configuration to set for the SDK.
76+
*/
77+
+ (void)initializeWithConfiguration:(ParseClientConfiguration *)configuration;
78+
79+
/*!
80+
@abstract Gets the current configuration in use by the Parse SDK.
81+
82+
@return The current configuration in use by the SDK. Returns nil if the SDK has not been initialized yet.
83+
*/
84+
+ (ParseClientConfiguration *)currentConfiguration;
85+
6986
/*!
7087
@abstract The current application id that was used to configure Parse framework.
7188
*/

0 commit comments

Comments
 (0)