С наступающим Новым годом! Форум программистов, компьютерный форум, киберфорум
Наши страницы
Objective-C
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.83/6: Рейтинг темы: голосов - 6, средняя оценка - 4.83
BigDanceMouse
5 / 5 / 1
Регистрация: 26.01.2014
Сообщений: 69
1

Прерываем выполнение метода

26.01.2014, 17:17. Просмотров 1073. Ответов 9
Метки нет (Все метки)

Добрый день!
Совсем недавно начал программировать на cocoa touch. До этого ни когда, ни на чем не программировал. Но вот сейчас уже имею 1 приложение опубликованное в AppStore и почти готовое обновление 1.1 для него. "Почти" это как раз по причини того что возникли сложности вот где:

Имею UISearchBar. К нему метод textDidChange,
в котором в dispatch_async в бэкграунде начинается загрузка из сети JSON,
парсинг в NSDictionary,
Из которого берем allKey в NSArray доступный глобально
и в самом конце метода вызываем dispatch_async в главном потоке в котором выполняем [tableView reloadData] с данными из того самого NSArray.
Проблема в том что при быстром наборе символов в UISearchBar часто в tableView отображаются данные без последнего введенного символа. В связи с этим встал вопрос:
Как в самом начале метода textDidChange: остановить предидущую загрузку данных?

(заранее сори если не понятно объясняю - всего 2 месяца в этой теме варюсь).
0
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
26.01.2014, 17:17
Ответы с готовыми решениями:

Прервать выполнение метода
Как прервать выполнение метода, если нет доступа к исходникам метода. Метод...

Непрерывное выполнение метода
Есть метод, который считывает данные с определенных юрлов. Но данные по этим...

Автоматическое выполнение метода
var password = { pass: '', hard: '1', // Сложность пароля length: '6',...

Прервать выполнение метода
Есть метод выполняющий рекурсивный поиск файлов в директории. Если один такой...

Автоматическое выполнение метода
При инжекте dll в процесс должен выполнятся метод в этой dll. Где-то слышал,...

9
Dan_banan_
11 / 11 / 1
Регистрация: 03.03.2013
Сообщений: 87
Записей в блоге: 1
27.01.2014, 10:11 2
Лучший ответ Сообщение было отмечено BigDanceMouse как решение

Решение

тогда надо использовать не dispatch_async а NSOperationQueue, там есть методы stopAllOperations или как то так
0
zulkis
684 / 611 / 43
Регистрация: 13.01.2011
Сообщений: 1,724
27.01.2014, 10:54 3
Покопайпе данный код. Там то, что вам нужно.
0
Dan_banan_
11 / 11 / 1
Регистрация: 03.03.2013
Сообщений: 87
Записей в блоге: 1
27.01.2014, 11:20 4
ох извращения какие))
0
BigDanceMouse
5 / 5 / 1
Регистрация: 26.01.2014
Сообщений: 69
27.01.2014, 23:55  [ТС] 5
Ну в общем решил задачу следующим способом:
В начале textDidChange поставил проверку на наличие операторов в потоке и если больше 0 то waitUntilAllOperationsAreFinished, ну и соответственно подправил часть кода под NSInvocationOperation. А cancel и cancelAllOperations по чему то не помогли.

А вот подскажите пожалуйста в чем отличие dispatch_async и NSOperationQueue ну разумеется помимо того как эти методы описываются?
0
zulkis
684 / 611 / 43
Регистрация: 13.01.2011
Сообщений: 1,724
28.01.2014, 07:19 6
BigDanceMouse, странное решение - грузить заведомо ненужные данные...
0
BigDanceMouse
5 / 5 / 1
Регистрация: 26.01.2014
Сообщений: 69
28.01.2014, 07:39  [ТС] 7
Да, оно мне тоже не очень нравится но что то ни как не получается отменить методы. Попробую еще по вашей ссылке разобратся.
0
BigDanceMouse
5 / 5 / 1
Регистрация: 26.01.2014
Сообщений: 69
15.02.2014, 23:53  [ТС] 8
Если кому то пригодиться мой опыт то решил проблему вот как:

организовал загрузку через UIURLConnection в отдельном потоке через NSOperationQueue
В начало метода textDidChange воткнул [connection cancel]; [queue cancelAllOperations];

та-да! Все работает так как хотелось - юзер вводит текст - если медленное соединение или быстрый юзер - текст отобразится тот, который будет последним, а если быстрое соединение или медленный юзер - текст будет обновляться после нажатия каждой кнопки.
0
zulkis
684 / 611 / 43
Регистрация: 13.01.2011
Сообщений: 1,724
16.02.2014, 08:51 9
BigDanceMouse, имеет место на жизнь, вы молодец.
0
Vorona
Peace 2 all shining faces
672 / 534 / 84
Регистрация: 05.03.2010
Сообщений: 1,283
16.02.2014, 17:31 10
советовал бы покопать в сторону ReactiveCocoa для решения подобных задач, на будущее
кстати, парень описывает аналогичную ситуацию: http://www.youtube.com/watch?v=YlsunWT87eo#t=902
0
16.02.2014, 17:31
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.02.2014, 17:31

Проверить выполнение метода
Есть такой метод: public static Boolean sendSMS(String to, String text) В его...

Выполнение метода в отдельном потоке
Всем привет. Я вообщем то пользуюсь RAD Studio XE но смысл тот же самый ...

Отменить выполнение метода по таймауту
Умею отменять методы по таймауту. К примеру, есть метод LongRunningMethod. Его...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru