3

我想继续使用我当前的 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];
4

3 回答 3

7

有一个示例项目展示了如何将 RestKit 与 MagicalRecord @ https://github.com/blakewatters/RKMagicalRecord一起使用

于 2013-03-15T01:54:31.903 回答
1

总结布莱克的解决方案

使用类扩展来公开对 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];
于 2014-11-05T06:24:13.917 回答
0

有两种方法可以实现这一点:

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
于 2012-07-20T01:34:58.497 回答