我正在开发一个应用程序,它结合了其核心数据存储的iCloud同步(简单的应用程序与单个存储/模型/上下文)。由于商店还包含图像数据,因此它有可能变得非常大,因此我想添加一个设置以允许用户根据需要禁用同步。我已经查看了在两种情况下使用Core Data的示例代码,并且在我看来,启用和禁用iCloud运行之间的唯一真正区别是添加时传递给NSPersistentStoreCoordinator
的选项。因此,我曾经做过类似的事情:
NSPersistentStoreCoordinator *psc;
NSDictionary* options;
//Set options based on iCloud setting
if ([enableSwitch isOn]) {
options = [NSDictionary dictionaryWithObjectsAndKeys:
@"<unique name here>", NSPersistentStoreUbiquitousContentNameKey,
cloudURL, NSPersistentStoreUbiquitousContentURLKey,
[NSNumber numberWithBool:YES], NSMigratePersistentStoresAutomaticallyOption,
[NSNumber numberWithBool:YES], NSInferMappingModelAutomaticallyOption,
nil];
} else {
options = nil;
}
//Add the coordinator
if (![psc addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeUrl options:options error:&error]) {
//Handle error
}
所以,我对上述内容有几个问题:
谢谢!
答案 0 :(得分:1)
这是我提出的解决方案,它运作良好。基本上,下面的代码放在一个方法中,您可以在应用程序启动时调用该方法,也可以在面向用户的“启用iCloud Sync”设置更改时随时调用。所有需要在两种操作模式之间进行更改的是NSPersistentStore
实例,底层模型文件和协调器不需要更改。
我的应用程序只需要担心一个持久性存储,因此在调用此方法时,它只会删除当前连接到协调器的所有存储,然后根据用户设置创建一个具有相应选项的新存储。
NSFileManager *fileManager = [NSFileManager defaultManager];
NSURL *storeURL = [[self applicationDocumentsDirectory] URLByAppendingPathComponent:@"DataModel.sqlite"];
NSError *error = nil;
NSArray *stores = [__persistentStoreCoordinator persistentStores];
for (int i=0; i < [stores count]; i++) {
[__persistentStoreCoordinator removePersistentStore:[stores objectAtIndex:i] error:&error];
}
//Determine availability. If nil, service is currently unavailable
NSURL *cloudURL = [fileManager URLForUbiquityContainerIdentifier:nil];
if (!cloudURL) {
NSLog(@"iCloud currently unavailable.");
}
//Check if user setting has been set
if (![[NSUserDefaults standardUserDefaults] objectForKey:kCloudStorageKey]) {
//Set the default based on availability
BOOL defaultValue = (cloudURL == nil) ? NO : YES;
[[NSUserDefaults standardUserDefaults] setBool:defaultValue forKey:kCloudStorageKey];
[[NSUserDefaults standardUserDefaults] synchronize];
}
//Set options based on availability and use settings
BOOL cloudEnabled = [[NSUserDefaults standardUserDefaults] boolForKey:kCloudStorageKey];
NSDictionary *options = nil;
if (cloudEnabled && cloudURL) {
NSLog(@"Enabling iCloud Sync in Persistent Store");
options = [NSDictionary dictionaryWithObjectsAndKeys:
@"<awesome.unique.name.key>", NSPersistentStoreUbiquitousContentNameKey,
cloudURL, NSPersistentStoreUbiquitousContentURLKey,
[NSNumber numberWithBool:YES], NSMigratePersistentStoresAutomaticallyOption,
[NSNumber numberWithBool:YES], NSInferMappingModelAutomaticallyOption,
nil];
}
//Add the store with appropriate options
if (![__persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:options error:&error])
{
NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
abort();
}
如果您的应用程序使用多个商店,您可能需要保持对要启用/禁用同步的商店的引用,以便您可以采用更智能的方法,而不是每次都将它们全部吹走。 / p>