Estoy creando una aplicación de diccionario para iPhone que da resultado mientras los usuarios escriben. Yo uso hilos (NSThread) para actualizar UITableView para que el hilo principal no esté bloqueado.Actualice UITableView usando subprocesos
Sin embargo, un accidente ocurre cuando el UITableView pide a la fuente de datos para el número de filas (tableView: numberOfRowsInSection :) y vuelvo, por ejemplo, 10. A continuación, se solicita a la fuente de datos para las células 0-9 (tableView: cellForRowAtIndexPath :). Pero en el momento en que solicita la celda 7, la fuente de datos ya ha cambiado, y ahora solo tiene 5 filas, lo que causa un bloqueo.
Aquí es cómo resolver el problema:
creo un NSLock en el método init.
Y aquí es lo que la fuente de datos se parece a:
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
return [results count];
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
static NSString *CellIdentifier = @"Cell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
}
[lock lock];
if (indexPath.row < [results count]) {
cell.textLabel.text = [results objectAtIndex:indexPath.row];
}
[lock unlock];
return cell;
}
Y aquí está el código que utilizo para actualizar la tabla:
[tableView performSelectorOnMainThread:@selector(reloadData) withObject:nil waitUntilDone:NO];
Resuelve el problema de bloqueo completo. Sin embargo, creo que podría no ser eficiente porque la fuente de datos tiene que bloquearse/desbloquearse cada vez que se solicita una celda. Y el caso que mencioné arriba no sucede tan a menudo. ¿Alguien tiene una mejor idea de cómo resolver este problema de manera eficiente?
Muchas gracias!
No debe actualizar la interfaz de usuario en otro hilo. – rickharrison
Rick, tengo que buscar el resultado en otro hilo porque el método de búsqueda es bastante lento y no quiero que bloquee el hilo principal. ¿Podría explicar cómo puedo lograr eso sin usar otro hilo? – ifvc
hacerlo más rápido.¿Por qué estás buscando? – mvds