2012-07-20 12 views
3

我想繼續使用我當前的RestKit,同時使用MagicRecord獲取其餘的提取和更新。我希望Restkit的MOC發送更新到MagicRecord的默認上下文。如果我理解正確,這就是我正在做的。這個可以嗎?在RestKit中使用MagicalRecord與另一個現有上下文

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.' 

EDIT 2

我發現一個黑客。首先,在magicalrecord中打開默認上下文的setter。接下來,更改RestKit存儲的併發類型,以便可以在magicalrecord中使用它的上下文。

的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]; 

回答

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 
+0

怎麼樣我上面所用的方法是什麼?分享協調員? – angelokh 2012-07-20 01:38:53

+0

BTW,MR_setDefaultContext是私有方法。 – angelokh 2012-07-20 01:41:42

+0

我試過第一個(設置默認上下文),但得到這個錯誤。 ***終止應用程序,由於未捕獲異常'NSInvalidArgumentException',原因:'只能在使用隊列創建的NSManagedObjectContext上使用-performBlockAndWait:'。 – angelokh 2012-07-20 01:50:10

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]; 
相關問題