removeAllObjects не удаляется, если действие быстро - PullRequest
0 голосов
/ 14 марта 2011

Я использую панель поиска в своем приложении и показываю некоторые результаты ниже из ext API.Сначала содержимое сохраняется в массиве «xyz», и каждый раз, когда пользователь вводит данные в строке поиска, я удаляю AllObjects и перезагружаю таблицу.

Результаты верны, если пользователь печатает медленно, т.е. [xyz removeAllObjects] работаетхорошо ... Однако, если пользователь печатает очень быстро, [xyz removeAllObjects], кажется, не имеет никакого эффекта, и дублирующие элементы добавляются в массив ..

Я не уверен, как это исправить.Пожалуйста, помогите мне.Спасибо.

Ответы [ 2 ]

3 голосов
/ 14 марта 2011

removeAllObjects является полностью последовательной операцией; этот метод не возвращается, пока массив не станет пустым.

Следовательно, в игре должен быть поток, и вы, скорее всего, получаете доступ к изменяемому массиву из нескольких потоков. Изменяемые массивы не являются потокобезопасными. Исправьте эксклюзивность, и вы исправите свою проблему.

Самый простой способ - отделить отображаемый массив от вычисляемого. Как только вычисления завершены, переместите вычисляемый массив в массив отображения и никогда не изменяйте его снова.

2 голосов
/ 14 марта 2011

Почему бы не создать новый NSArray, указать на него результаты, а затем выпустить старый массив.Таким образом, наличие дубликатов будет невозможно.Что-то вроде:

NSArray *newArray = [someObject newSearchResults];
NSArray *oldArray = xyz;
xyz = [newArray retain];
[oldArray release];
...