removeAllObjects не удаляется, если действие выполняется быстро

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

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

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


person copenndthagen    schedule 14.03.2011    source источник


Ответы (2)


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

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

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

person bbum    schedule 14.03.2011
comment
Ах да... замена кода потока на обычный [self method:]; устраняет проблему ... Однако с этим есть только 1 проблема; Панель поиска блокируется, т.е. пользователь теперь не может быстро печатать и ждать каждый раз, когда вводится буква... Итак, есть ли способ заставить обе вещи работать одновременно? - person copenndthagen; 14.03.2011
comment
Я также пробовал с двумя отдельными массивами. Но это тоже не сработало. Я пытаюсь найти решение, сохраняющее только 1 массив, чтобы избежать каких-либо сложностей... - person copenndthagen; 14.03.2011
comment
Почему не работали два массива? Это общепринятое решение в таком случае. - person bbum; 14.03.2011

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

NSArray *newArray = [someObject newSearchResults];
NSArray *oldArray = xyz;
xyz = [newArray retain];
[oldArray release];
person Ned    schedule 14.03.2011