Ответ операции PUT не сохраняется в Core Data Store

Я пытаюсь аутентифицировать пользователя с помощью github с помощью RestKit и сохраняю ответ обратно в данные Core, чтобы повесить токен oauth. Ответ возвращается с 200 или 201, что хорошо, но ничего не сохраняется обратно в контекст. Я предполагаю, что мне не хватает чего-то маленького, но я не могу этого понять. Вот что происходит:

Это происходит в viewDidLoad

RKObjectManager *objectManager = [RKObjectManager sharedManager];
RKManagedObjectStore *managedObjectStore = [RKManagedObjectStore defaultStore];
RKEntityMapping *entityMapping = [RKEntityMapping mappingForEntityForName:@"SLAuthentication" inManagedObjectStore:managedObjectStore];

NSString *clientID = [(SLAppDelegate *)[[UIApplication sharedApplication] delegate] clientID];



[entityMapping addAttributeMappingsFromDictionary:@{@"id" : @"tokenID", @"url" : @"url", @"token" : @"oauthToken", @"note" : @"note"}];

entityMapping.identificationAttributes = @[@"tokenID"];

RKResponseDescriptor *responseDescriptor = [RKResponseDescriptor responseDescriptorWithMapping:entityMapping method:RKRequestMethodPUT pathPattern:[NSString stringWithFormat:@"/authorizations/clients/%@", clientID] keyPath:nil statusCodes:RKStatusCodeIndexSetForClass(RKStatusCodeClassSuccessful)];

[objectManager addResponseDescriptor:responseDescriptor];

Вот где делается запрос

NSManagedObjectContext *context = [[[RKObjectManager sharedManager] managedObjectStore] mainQueueManagedObjectContext];

NSString *secret = [(SLAppDelegate *)[[UIApplication sharedApplication] delegate] clientSecret];

NSString *clientID = [(SLAppDelegate *) [[UIApplication sharedApplication] delegate] clientID];

[[RKObjectManager sharedManager].HTTPClient setAuthorizationHeaderWithUsername:userName password:pass];
[[RKObjectManager sharedManager] setRequestSerializationMIMEType:@"application/json"];



[[RKObjectManager sharedManager] putObject:nil path :[NSString stringWithFormat:@"/authorizations/clients/%@", clientID] parameters:@{@"client_secret": secret, @"scopes" : @[@"repo"]} success:nil failure:nil];


//Flush the username and password so that we aren't storing them anymore.
[[RKObjectManager sharedManager].HTTPClient clearAuthorizationHeader];
NSFetchRequest *request = [[NSFetchRequest alloc] initWithEntityName:@"SLUser"];
NSError *error = nil;

NSArray *users = [context executeFetchRequest:request error:&error];

[[users firstObject] setUserName:userName];

[context save:&error];

Но ничего не возвращается. Описание API находится здесь: http://developer.github.com/v3/oauth/#get-or-create-an-authorization-for-a-specific-app


person bringel    schedule 09.11.2013    source источник
comment
Также похоже, что ответ отображается в правильный объект, но сущность не сохраняется в конце. Есть предположения? Игнорировать запрос на выборку и сохранить в конце, RestKit все равно должен сохранять правильно?   -  person bringel    schedule 10.11.2013


Ответы (1)


Ответ является асинхронным, поэтому вам нужно реализовать блоки успеха (и отказа) в запросе на размещение и запустить там свой запрос на выборку. Но ваша выборка предназначена для другого объекта, поэтому неясно, как вы проверяете / используете возвращенный объект аутентификации.

Если у вас все еще есть проблемы, включите ведение журнала трассировки для сопоставления, чтобы получить дополнительную информацию и проверить ошибки, возвращенные в блок сбоев.

person Wain    schedule 09.11.2013
comment
Даже если блоки успеха / неудачи равны нулю, не следует ли сохранять сущность при возврате запроса? И не обращайте внимания на проверки внизу, они были от других вещей, которые еще не были удалены. - person bringel; 09.11.2013
comment
Не когда запрос вернется - он не блокируется до завершения. Сохранение произойдет, если они равны нулю, но вы не узнаете, когда это произойдет ... - person Wain; 10.11.2013
comment
Выполнение запроса на выборку в успешном блоке работает, но попытка получить этот объект в другом контроллере представления ничего не возвращает. Должен ли я использовать определенный управляемый объектContext? - person bringel; 10.11.2013
comment
Для пользовательского интерфейса вы всегда должны использовать MOC основной очереди из хранилища объектов. - person Wain; 10.11.2013