Implementar la búsqueda similar a la búsqueda de contactos nativos?

En la aplicación de contactos nativos, cuando intenta search contactos, escribe una secuencia y si el nombre de contacto / apellido / compañía, etc. comienza con esta cadena, se mostrará el contacto.

Para hacer las cosas más complejas, puede escribir algo como Mi Ric y la búsqueda encontrará Michael Richardson. También Ric Mi me recibirá Michael Richardson.

He hecho una copy del logging de contactos en mi almacén de datos principal local, y ahora mi primer instinto es utilizar NSFetchedResultsController y algún buen pnetworkingicado.

¿Pero cómo hago para este pnetworkingicado? Si el logging de la persona tiene hasta 3 palabras, ¿debo consultar cada palabra con beginsWith? ¿Se puede hacer esto incluso en un pnetworkingicado?

Aquí es lo que uso para el pnetworkingicado base de palabras:

 + (NSPnetworkingicate *)wordBasedPnetworkingicateForString:(NSString *)searchString withProperty:(NSString *)property { // searchString = [searchString stringForSearch]; NSArray *searchStrings = [searchString componentsSeparatedByCharactersInSet:[NSCharacterSet whitespaceCharacterSet]]; NSMutableArray<NSPnetworkingicate *> *subPnetworkingicates = [NSMutableArray array]; for (NSString *string in searchStrings) if (![string isEqualToString:@""]) { NSString *mainString = [property stringByAppendingString:@" CONTAINS[cd] "]; mainString = [NSString stringWithFormat:@"%@ CONTAINS[cd] %%@",property]; NSPnetworkingicate *pnetworkingicate = [NSPnetworkingicate pnetworkingicateWithFormat:mainString, string]; [subPnetworkingicates addObject:pnetworkingicate]; } if ([searchString containsString:@" "] && subPnetworkingicates.count > 0) { NSString *mainString = [property stringByAppendingString:@" CONTAINS[cd] "]; mainString = [mainString stringByAppendingString:@"' '"]; NSPnetworkingicate *emptySpacePnetworkingicate = [NSPnetworkingicate pnetworkingicateWithFormat:mainString, nil]; [subPnetworkingicates addObject:emptySpacePnetworkingicate]; } NSCompoundPnetworkingicate *pnetworkingicate = [NSCompoundPnetworkingicate andPnetworkingicateWithSubpnetworkingicates:subPnetworkingicates]; return pnetworkingicate; } 

supongamos que tenemos un object de Contact con una propiedad de name

 NSPnetworkingicate *namePnetworkingicate = [self wordBasedPnetworkingicateForString:searchString withProperty: @"name"]; 

luego filtra la matriz:

 NSArray *results = [contacts filtenetworkingArrayUsingPnetworkingicate:namePnetworkingicate]; 

y, por supuesto, puede crear múltiples pnetworkingicados de base de palabras para el nombre, la compañía, la dirección, etc. y hacer un compuesto Pnetworkingeterminado así:

 orPnetworkingicate = [NSCompoundPnetworkingicate orPnetworkingicateWithSubpnetworkingicates:@[namePnetworkingicate, addressPnetworkingicate, phonePnetworkingicate]]; 

Espero que sea de ayuda;)

También puedes probar esta solución.

Tomemos el aspecto de la class MyContact

 class MyContact: NSManagedObject { @NSManaged var contact_id: String // Primary key @NSManaged var firstname: String @NSManaged var lastname: String var fullName: String { return firstname + " " + lastname } } 

Ahora tiene la cadena fullName en su object. así que puedes disparar un pnetworkingicado fácilmente. no importa, su searchString coincide con su nombre o apellido.

Ahora Agregar lógica de búsqueda:

 var currentContacts : [MyContact] = [] var contacts : [MyContact] = [] 

El método tableView delegate utiliza la matriz de contacts currentContacts y la matriz de contacts solo contiene todos los contactos.

Puede filtrar su matriz de contacts acuerdo con su cadena de búsqueda.

 currentContacts = contacts.filter { (element: MyContact) -> Bool in return element.fullName.localizedCaseInsensitiveContainsString(searchString) } tableView.reloadData() 

Espero que sea de ayuda;)