Tworzę aplikację słownikową dla iPhone'a, która daje wynik, gdy użytkownicy piszą. Używam wątków (NSThread) do aktualizacji UITableView tak, aby główny wątek nie był blokowany.Aktualizacja UITableView przy użyciu wątków
Jednak zdarza się awaria, gdy UITableView pyta źródło danych o liczbę wierszy (tableView: numberOfRowsInSection :) i zwracam, powiedzmy, 10. Następnie prosi o źródło danych dla komórek 0-9 (tableView: cellForRowAtIndexPath :). Ale do czasu, gdy prosi o komórkę 7, źródło danych już się zmieniło, a teraz ma tylko 5 wierszy, co powoduje awarię.
Oto jak rozwiązać ten problem:
tworzę NSLock w metodzie startowej.
A oto co źródło danych wygląda następująco:
- (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;
}
i tutaj jest kod, który używam do aktualizacji tabeli:
[tableView performSelectorOnMainThread:@selector(reloadData) withObject:nil waitUntilDone:NO];
To rozwiązuje problem zderzenia całkowicie. Uważam jednak, że może to nie być wydajne, ponieważ źródło danych musi blokować/odblokowywać za każdym razem, gdy zostanie poproszony o komórkę. A sprawa, o której wspomniałem powyżej, nie zdarza się tak często. Czy ktoś ma lepszy pomysł, jak skutecznie rozwiązać ten problem?
Dziękuję bardzo!
Nie należy zaktualizować UI w innym wątku. – rickharrison
Rick, muszę wyszukać wynik w innym wątku, ponieważ metoda wyszukiwania jest dość powolna i nie chcę, aby blokowała główny wątek. Czy mógłbyś wyjaśnić, w jaki sposób mogę to osiągnąć bez używania innego wątku? – ifvc
przyspieszyć.co na ziemi przeszukujesz ?! – mvds