0

RestKit で POST リクエストを作成しようとしていますが、RKObjectManager の postObject メソッドを呼び出すとのエラーが発生します。

Can only use -performBlockAndWait: on an NSManagedObjectContext that was created with a queue.

このエラーは、メソッドperformBlockAndWaitがRKManagedObjectRequestOperationクラスによって呼び出されたときに発生しました。

これが私のコードです:

RKObjectMapping *responseMapping = [RKObjectMapping requestMapping];
[responseMapping addAttributeMappingsFromDictionary:@{
 // ...
 }];

NSIndexSet *statusCodes = RKStatusCodeIndexSetForClass(RKStatusCodeClassSuccessful); // Anything in 2xx
NSString *pathPattern = @"myPath";
RKResponseDescriptor *responseDescriptor = [RKResponseDescriptor responseDescriptorWithMapping:responseMapping method:RKRequestMethodPOST pathPattern:pathPattern keyPath:nil statusCodes:statusCodes];

RKObjectMapping *requestMapping = [RKObjectMapping requestMapping];
[requestMapping addAttributeMappingsFromDictionary:@{
 // ...
 }];

RKRequestDescriptor *requestDescriptor = [RKRequestDescriptor requestDescriptorWithMapping:requestMapping objectClass:[MyClass class] rootKeyPath:@"" method:RKRequestMethodPOST];

NSURL *baseURL = [NSURL URLWithString:@"http://192.168.1.1:8080"];
RKObjectManager *manager = [RKObjectManager managerWithBaseURL:baseURL];
[manager addRequestDescriptor:requestDescriptor];
[manager addResponseDescriptor:responseDescriptor];

NSManagedObjectModel *managedObjectModel = [NSManagedObjectModel mergedModelFromBundles:nil];
RKManagedObjectStore *managedObjectStore = [[RKManagedObjectStore alloc] initWithManagedObjectModel:managedObjectModel];
manager.managedObjectStore = managedObjectStore;

[managedObjectStore createPersistentStoreCoordinator];
NSString *storePath = [RKApplicationDataDirectory() stringByAppendingPathComponent:@"mySqliteDatabaseFile"];
NSError *error;
NSPersistentStore *persistentStore = [managedObjectStore addSQLitePersistentStoreAtPath:storePath fromSeedDatabaseAtPath:nil withConfiguration:nil options:nil error:&error];

NSAssert(persistentStore, @"Failed to add persistent store with error: %@", error);

[managedObjectStore createManagedObjectContexts];
managedObjectStore.managedObjectCache = [[RKInMemoryManagedObjectCache alloc] initWithManagedObjectContext:managedObjectStore.persistentStoreManagedObjectContext];

// POST to create
@try {
    [manager postObject:visitReport path:@"myPath" parameters:nil success:^( RKObjectRequestOperation *operation , RKMappingResult *mappingResult ) {
        NSLog(@"Success");
    } failure:^( RKObjectRequestOperation *operation , NSError *error ){
        NSLog(@"Failure - %@",error);
    }];
}
@catch (NSException *exception) {
    NSLog(@"error - %@", exception);
}

私のコンテキストの問題がわかりません。どんな助けも歓迎します。ありがとうございました。

4

1 に答える 1

1

ようやく問題が見つかりました:

私が POST しようとしたオブジェクト visitReport は、RestKit が期待する NSManagedObjectContext のものではありません。

解決するために、新しいオブジェクトを作成します:

MyObject *visitReportContext = [NSEntityDescription insertNewObjectForEntityForName:@"tableName" 
                                                    inManagedObjectContext:objectStore.mainQueueManagedObjectContext];
visitReportContext.Id = visitReport.Id
visitReportContext.title = visitReport.title
// etc..

次に、新しいオブジェクトを POST すると、機能します。しかし、それはあまり美しくありません...この「RestKitコンテキスト」で新しいオブジェクトを作成せずに、古いオブジェクトのvisitReportを処理するにはどうすればよいですか?

于 2013-09-05T14:50:45.703 に答える