Estoy trabajando en una aplicación en la que deseo realizar una búsqueda remota en un servidor. Quiero que RestKit guarde los datos recuperados en la base de datos. Primero realizo una búsqueda local (que actualmente funciona) luego deseo hacer la búsqueda remota y luego actualizar una vista de tabla con los nuevos resultados.iOS, búsqueda de servidor remoto con RestKit
Tengo dos problemas, 1. cómo debe ser mi asignación y 2. el json devuelve una matriz con dos tipos diferentes de objetos.
La URL tiene el siguiente aspecto:
search.json?search=[search string]
El JSON devuelve el siguiente aspecto:
[
{
"event": {
"id": 2,
[...]
},
{
"news": {
"id": 16,
[...]
}
Dónde evento y noticias son dos tipos de objetos.
En mi aplicación tengo tres modelos, Post (entidad abstracta y superclase) NewsPost (subclase para Publicar) y Evento (subclase para Publicar).
Mis asignaciones se ve así:
RKManagedObjectMapping* newsMapping = [RKManagedObjectMapping mappingForClass:[NewsPost class] inManagedObjectStore:objectManager.objectStore];
newsMapping.primaryKeyAttribute = @"newsId";
newsMapping.rootKeyPath = @"news";
[newsMapping mapKeyPath:@"id" toAttribute:@"newsId"];
RKManagedObjectMapping *eventMapping = [RKManagedObjectMapping mappingForClass:[CalendarEvent class] inManagedObjectStore:objectManager.objectStore];
eventMapping.primaryKeyAttribute = @"calendarId";
eventMapping.rootKeyPath = @"calendars";
[eventMapping mapKeyPath:@"id" toAttribute:@"calendarId"];
// These two works.
[objectManager.mappingProvider setObjectMapping:newsMapping forResourcePathPattern:@"/package_components/1/news"];
[objectManager.mappingProvider setObjectMapping:eventMapping forResourcePathPattern:@"/package_components/1/calendars"];
// I don't know how these should look/work.
// Since the search word can change
[objectManager.mappingProvider setObjectMapping:eventMapping forResourcePathPattern:@"/package_components/1/search\\.json?search="];
[objectManager.mappingProvider setObjectMapping:newsMapping forResourcePathPattern:@"/package_components/1/search\\.json?search="];
Mi código de búsqueda se parece a esto (trabajos de búsqueda local):
- (void)setUpSearch
{
if (self.searchField.text != nil) {
[self.posts removeAllObjects];
[self.events removeAllObjects];
[self.news removeAllObjects];
// Search predicates.
// Performs local search.
NSPredicate *contactNamePredicate = [NSPredicate predicateWithFormat:@"contactName contains[cd] %@", self.searchField.text];
NSPredicate *contactDepartmentPredicate = [NSPredicate predicateWithFormat:@"contactDepartment contains[cd] %@", self.searchField.text];
[...]
NSArray *predicatesArray = [NSArray arrayWithObjects:contactNamePredicate, contactDepartmentPredicate, contactEmailPredicate, contactPhonePredicate, linkPredicate, titlePredicate, nil];
NSPredicate *predicate = [NSCompoundPredicate orPredicateWithSubpredicates:predicatesArray];
self.posts = [[Post findAllWithPredicate:predicate] mutableCopy];
if (self.posts.count != 0) {
self.noResultsLabel.hidden = YES;
for (int i = 0; i < self.posts.count; i++) {
Post * post = [self.posts objectAtIndex:i];
if (post.calendarEvent == YES) {
[self.events addObject:post];
} else {
[self.news addObject:post];
}
}
}
// reload the table view
[self.tableView reloadData];
[self performRemoteSearch];
}
}
- (void)search
{
[self setUpSearch];
[self hideKeyboard];
[self performRemoteSearch];
}
- (void)performRemoteSearch
{
// Should load the objects from JSON
// Note that the searchPath can vary depending on search text.
NSString *searchPath = [NSString stringWithFormat:@"/package_components/1/search.json?search=%@", self.searchField.text];
RKObjectManager *objectManager = [RKObjectManager sharedManager];
[objectManager loadObjectsAtResourcePath:searchPath delegate:self];
}
- (void)objectLoader:(RKObjectLoader*)objectLoader didLoadObjects:(NSArray*)objects
{
// This never gets called.
// Should update my arrays and then update the tableview, but it never gets called.
// Instead I get Error Domain=org.restkit.RestKit.ErrorDomain Code=1001 "Could not find an object mapping for keyPath: ''
}
Algún consejo sobre la forma en que debería o podría hacer sería muy apreciada.
Hola, estoy pensando en intentar esta pregunta. 1. ¿Puede cambiar el formato de JSON de alguna manera? Quiero saber si puede agregar una ruta de clave raíz a cada uno de los resultados (eso lo simplificará mucho). 2. Usted está usando NSManagedObject para Noticias y Eventos. ¿Pretendes guardar el mapeo en Coredata luego de la búsqueda del usuario? –
Hola, sí, si es necesario, puedo cambiar el JSON. Y, sí, quiero almacenar en caché y guardar los resultados localmente cuando las búsquedas de los usuarios. – Anders
Avísame si la respuesta te sirve. –