将 MagicalRecord 与 RestKit 中的另一个现有上下文一起使用
Posted
技术标签:
【中文标题】将 MagicalRecord 与 RestKit 中的另一个现有上下文一起使用【英文标题】:Use MagicalRecord with another existing context in RestKit 【发布时间】:2012-07-20 01:02:22 【问题描述】:我想继续使用我当前的 RestKit,同时使用 MagicRecord 进行其余的获取和更新。我希望 Restkit 的 MOC 将更新发送到 MagicRecord 的默认上下文。如果我理解正确,这就是我正在做的事情。这样可以吗?
NSManagedObjectContext* context = [[RKObjectManager sharedManager].objectStore managedObjectContextForCurrentThread];
[MagicalRecord setupCoreDataStackWithAutoMigratingSqliteStoreNamed:[XDBStore storeName]];
[context setParentContext:[NSManagedObjectContext MR_defaultContext]];
也许是另一种方法,但仍不确定。
NSPersistentStoreCoordinator *coordinator = [[[RKObjectManager sharedManager] objectStore] persistentStoreCoordinator];
[NSPersistentStoreCoordinator MR_setDefaultStoreCoordinator:coordinator];
[NSManagedObjectContext MR_initializeDefaultContextWithCoordinator:coordinator];
以前有人遇到过同样的问题吗?
编辑 1
我尝试了@casademora 的建议 #1 来设置默认上下文,但得到了这个错误。
*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'Can only use -performBlockAndWait: on an NSManagedObjectContext that was created with a queue.'
编辑 2
我发现了一个黑客。首先,在magicrecord 中为默认上下文打开setter。接下来,更改 RestKit 存储的并发类型,使其上下文可以在 magicrecord 中使用。
NSManagedObjectContext+MagicalRecord.h
+ (void) MR_setDefaultContext:(NSManagedObjectContext *)moc;
+ (void) MR_setRootSavingContext:(NSManagedObjectContext *)context;
RKManagedObjectStore.m
NSManagedObjectContext *managedObjectContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSMainQueueConcurrencyType];
然后像这样设置 MagicalRecord:
NSManagedObjectContext* context = [[RKObjectManager sharedManager].objectStore managedObjectContextForCurrentThread];
[NSManagedObjectContext MR_setRootSavingContext:context];
NSManagedObjectContext *defaultContext = [NSManagedObjectContext MR_newMainQueueContext];
[defaultContext setParentContext:context];
[NSManagedObjectContext MR_setDefaultContext:defaultContext];
【问题讨论】:
【参考方案1】:有一个示例项目展示了如何将 RestKit 与 MagicalRecord @ https://github.com/blakewatters/RKMagicalRecord 一起使用
【讨论】:
【参考方案2】:总结布莱克的解决方案
使用类扩展来公开对 MagicalRecord 的私有 setter 方法的访问
@interface NSManagedObjectContext ()
+ (void)MR_setRootSavingContext:(NSManagedObjectContext *)context;
+ (void)MR_setDefaultContext:(NSManagedObjectContext *)moc;
@end
先做核心数据设置,再做这个
[NSPersistentStoreCoordinator MR_setDefaultStoreCoordinator:managedObjectStore.persistentStoreCoordinator];
[NSManagedObjectContext MR_setRootSavingContext:managedObjectStore.persistentStoreManagedObjectContext];
[NSManagedObjectContext MR_setDefaultContext:managedObjectStore.mainQueueManagedObjectContext];
【讨论】:
【参考方案3】:有两种方法可以实现:
1) 从 RestKit 中获取主上下文,并将其设置为默认上下文:
NSManagedObjectContext *rkContext = ...; //You'll have to figure this part out
[NSManagedObjectContext MR_setDefaultContext:rkContext];
2) 对于您执行的每次提取,只需指定上下文:
NSMangedObjectContext *rkContext = ...; //again, I don't know where to get this in restkit
[MyEntity MR_findAllInContext:rkContext]; // <- This will use the RestKit context
【讨论】:
我上面用的方法怎么样?分享协调员? 顺便说一句,MR_setDefaultContext 是私有方法。 我尝试了第一个(设置默认上下文),但收到此错误。 *** 由于未捕获的异常“NSInvalidArgumentException”而终止应用程序,原因:“只能在使用队列创建的 NSManagedObjectContext 上使用 -performBlockAndWait:”。以上是关于将 MagicalRecord 与 RestKit 中的另一个现有上下文一起使用的主要内容,如果未能解决你的问题,请参考以下文章
集成 RestKit 和 MagicalRecord 时出现 CoreData 轻量级迁移错误
Magical Record 做了哪些 RESTKit 没有做的事情?我会需要这两个框架吗?
应用程序通过 RestKit 和 Magical Record 滞后于巨大的核心数据映射
RestKit 两个连续的 enqueueBatchOfObjectRequestOperations 没有直接映射到核心数据