Поиск огромных данных приходит с веб-сервисов в iPhone - PullRequest
1 голос
/ 01 февраля 2012

Мне нужно разработать приложение, которое должно обрабатывать огромное количество данных, поступающих от вызова веб-службы.

Существует UITableView с панелью поиска. Когда пользователь вводит букву, табличное представление должно динамическиотобразить результат поиска, соответствующий тексту в строке поиска.

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

Ответы [ 5 ]

3 голосов
/ 01 февраля 2012

Хорошим подходом может быть перезагрузка таблицы только с данными, отфильтрованными поиском.

  1. У вас есть NSArray с вашими значениями
  2. Затем вы создаете еще один NSArray для ваших отфильтрованных результатов
  3. Затем вы проходите первый массив следующим образом:

    for (int i = 0; i < [arrayOfAll count]; i++){
    
        NSString *sTemp = [arrayOfAll objectAtIndex:i];
    
        NSRange titleResultsRange = [sTemp rangeOfString:searchText
                                                 options:NSCaseInsensitiveSearch];
    
        if (titleResultsRange.length > 0){
            [arrayOfResults addObject:sTemp];
        }
    }
    
  4. Теперь вы перезагрузите таблицу вместо arrayOfResultsиз arrayOfAll

2 голосов
/ 01 февраля 2012

Да, отправлять запрос каждый раз, когда пользователь вводит письмо, - плохая идея ... но, если, например, вы реализуете его с помощью NSOperationQueues, вы можете отменить предыдущие запросы при нажатии клавиши (любой символ или возврат) у вас будет только один запрос на сервер. Это всего лишь предложение, и, в любом случае, примите его во внимание.

Очевидно, что самый простой способ, как говорит Прашант,

@ tonio Как я понимаю, вы предполагаете, что у вас уже есть все данные в NSArray, и вы просто фильтруете результаты, анализируя их с помощью NSRange. Как сказал Картик, это огромный объем данных из веб-службы, и для его загрузки может потребоваться много времени, и это ненужный сетевой трафик. Но допустим, что именно так вы хотите это сделать. Я бы предложил отфильтровать результаты с помощью NSPredicate:

NSPredicate *predicate = [NSPredicate predicateWithFormat: @"SELF contains[cd] %@",searchText];
NSArray *filteredResults = [arrayOfAll filteredArrayUsingPredicate: predicate];

Теперь вы используете массив FilterResults в TableView.

0 голосов
/ 01 февраля 2012

Это зависит от того, насколько велик "огромный" и как пользователи будут использовать приложение.

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

Если данные не такие «огромные», то воспользуйтесь предложением tonio.mg, если вы не хотите иметь кнопку «поиска», как предложил Прашант Бхайани (это, вероятно, лучшее решение для мобильных устройств imho).

Помните, что важно не то, как вы «хотите» реализовать эту функцию, а то, как ваши конечные пользователи хотят, чтобы эта функция работала на них. Обычно пользователи не хотят ждать (для огромного набора данных), они хотят быстрого, простого и актуального доступа к данным (отложенная загрузка).

0 голосов
/ 01 февраля 2012

Проверьте эту ссылку. Он сортирует данные в UITableView по содержанию текста в строке поиска.

0 голосов
/ 01 февраля 2012

Не выполняйте поиск по каждой букве, а скорее, когда пользователь нажимает кнопку «Поиск».

...