3

残りのフェッチと更新にMagicRecordを使用している間、現在のRestKitを使い続けたいと思います。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

ハックを見つけました。まず、magicalrecordでデフォルトコンテキストのセッターを開きます。次に、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];
4

3 に答える 3

7

MagicalRecordでRestKitを使用する方法を示す利用可能なサンプルプロジェクトがあります@https ://github.com/blakewatters/RKMagicalRecord

于 2013-03-15T01:54:31.903 に答える
1

ブレイクのソリューションを要約すると

クラス拡張を使用して、MagicalRecordのプライベートセッターメソッドへのアクセスを公開します

@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

これを実現するには、次の2つの方法があります。

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 に答える