Magical Record、多种配置和 Restkit
Posted
技术标签:
【中文标题】Magical Record、多种配置和 Restkit【英文标题】:Magical Record, multiple configurations and Restkit 【发布时间】:2014-07-11 17:10:06 【问题描述】:我在一个相当大的 ios 项目中使用 Magical Record。我使用配置将大型种子数据库与用户数据分开。由于 Magical Record 不支持配置,所以我解构了 Magical Record 的 setupCoreDataStackWithAutoMigratingSqliteStoreNamed 方法,并将其替换为以下内容:
+(void) RB_setupMultipleStores:(NSString *) seedStoreName userStore:(NSString *) userStoreName
/* change persistent store to one with multiple configurations. Assumes Magical Record is initialized to perform auto migration. */
NSError * error= nil;
[MagicalRecord cleanUp]; //Tear down Magical Record
NSManagedObjectModel * model = [NSManagedObjectModel MR_defaultManagedObjectModel];
NSURL *seedURL = [NSPersistentStore MR_urlForStoreName:[seedStoreName stringByAppendingString:@".sqlite"]];
NSPersistentStoreCoordinator * coordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:model];
NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys:
[NSNumber numberWithBool:YES], NSMigratePersistentStoresAutomaticallyOption,
[NSNumber numberWithBool:YES], NSInferMappingModelAutomaticallyOption,
nil];
NSPersistentStore * seedStore =[coordinator
addPersistentStoreWithType:NSSQLiteStoreType
configuration:@"Seed"
URL:seedURL
options:options
error:&error];
if (!seedStore || error)
NSLog(@"Error setting up seed store:%@ for %@", [error localizedDescription], seedURL);
exit(-1);
NSURL *userURL = [NSURL URLForDocumentDirectoryWithAppendedPath:[userStoreName stringByAppendingString:@".sqlite"]];
NSPersistentStore * userStore = [coordinator
addPersistentStoreWithType:NSSQLiteStoreType
configuration:@"User"
URL:userURL
options:options
error:&error];
if (!userStore || error)
NSLog(@"Error setting up user store:%@ for %@", [error localizedDescription], userURL);
exit (-1);
[NSPersistentStoreCoordinator MR_setDefaultStoreCoordinator:coordinator];
//Bring back Magical Record with updated coordinator.
[NSManagedObjectContext MR_initializeDefaultContextWithCoordinator:coordinator];
[[NSManagedObjectContext MR_defaultContext] setUndoManager:nil];
现在我将添加 Restkit。我需要共享对象模型和持久存储,而且我宁愿使用一组上下文,而不是使用两个不同的堆栈。
我看到了五种潜在的方法:
修改https://github.com/blakewatters/RKMagicalRecord 以支持多种配置。这看起来微不足道,但它需要我使用一个类别来显示一些私有方法,并且优秀的 MR 开发人员建议不要显式设置 MR 默认和根保存上下文。
首先创建 Magical Record 上下文,然后将它们分配给 Restkit。这甚至会起作用吗?这有意义吗?
从同一个 NSPersistentStoreCoordinator 初始化 Restkit 和 Magical Record。这有意义吗?
使用不同但相似的 NSPersistentStoreCoordinators 创建两个单独的堆栈。
创建我自己的堆栈和上下文,并使用这些上下文对 Restkit 和 MR 进行所有调用。
任何人都可以推荐这些或任何其他方法吗?每个都需要付出巨大的努力才能进行测试。我即将走上#1 的道路。
谢谢...
【问题讨论】:
嗨@ron,您能否使用您在接受的答案中提到的解决方案更新您的原始代码?谢谢 【参考方案1】:从根本上说,CoreData 已经有办法解决这个问题。您可以让多个协调员指向同一个商店,或者任何您的场景。由每个框架决定是否允许您针对框架本身未创建或设置的堆栈使用。
MagicalRecord 归结为一组用于获取和保存的辅助方法。您不需要使用 MagicalRecord 的任何设置方法来在您的提取中发挥其魔力。设置方法可以帮助您更快地处理新项目,并为“默认”上下文提供单个访问点,以供您在主线程/队列上执行提取时使用。对于所有其他用途,每次都使用显式 inContext: 参数。使用该参数,您可以使用任何您想要的 MOC,一切都会正常工作。这是设计使然。从未编写过 MagicalRecord 来替代 CoreData。它是为了让简单的任务更容易而编写的。
这样,您可以让 RestKit 处理您的整个 CoreData 堆栈,并将 MagicalRecord 仅用于方便的 API 来获取和保存。这将使您不必执行任何这些解决方案,而只需回到解决您的应用特定问题...
【讨论】:
而且,作为个人说明,我还建议重新考虑您对 RestKit 的依赖。它非常脆弱且过于复杂。这是基于个人意见的 RestKit 项目经验。 谢谢!根据您的回答,看来我做了一些不必要的工作。我使用 Restkit 创建了一个持久存储协调器,添加了我的配置,使用 Restkit 创建了上下文堆栈,然后将这些上下文分配给 MR 的根上下文和默认上下文。一切似乎都在工作。下次我将创建两个持久存储协调器并让每个人都按原样运行。由于我一直在使用 MR,所以我不愿意返回并从默认上下文更改为 Restkit 的上下文。 关于 Restkit - 我最初的印象是它做了很多垃圾工作,但代价是隐藏了真正发生的事情。我一直在使用 curl 首先模拟呼叫,然后在我理解它后使用 Restkit 引入大炮。我希望它适用于我的应用程序。 现在我已经使用 Restkit 几个月了,我很遗憾没有听取 Mora 先生的明智建议。 Restkit只有通过巨大的痛苦和痛苦才能完成非常简单和简单的事情。调试代码非常困难。我现在正在使用 AFNetworking,我更开心了。以上是关于Magical Record、多种配置和 Restkit的主要内容,如果未能解决你的问题,请参考以下文章
导入与 Core Data 和 Magical Record 的关系
CoreData + Magical Record 运行选择查询
如何在 Core Data 和 Magical Record 中存储一系列电子邮件