Форум программистов, компьютерный форум, киберфорум
Objective-C
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.78/9: Рейтинг темы: голосов - 9, средняя оценка - 4.78
5 / 5 / 1
Регистрация: 26.01.2014
Сообщений: 69
1

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

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

Author24 — интернет-сервис помощи студентам
Добрый день!
Совсем недавно начал программировать на 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)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
26.01.2014, 17:17
Ответы с готовыми решениями:

Как из метода отправить переменную в другой метод и продолжить выполнение метода?
Здравствуйте, подскажите пожалуйста, как из метода отправить переменную в другой метод и продолжить...

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

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

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

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

Решение

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

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

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

та-да! Все работает так как хотелось - юзер вводит текст - если медленное соединение или быстрый юзер - текст отобразится тот, который будет последним, а если быстрое соединение или медленный юзер - текст будет обновляться после нажатия каждой кнопки.
0
686 / 613 / 43
Регистрация: 13.01.2011
Сообщений: 1,722
16.02.2014, 08:51 9
BigDanceMouse, имеет место на жизнь, вы молодец.
0
Peace 2 all shining faces
674 / 535 / 85
Регистрация: 05.03.2010
Сообщений: 1,282
16.02.2014, 17:31 10
советовал бы покопать в сторону ReactiveCocoa для решения подобных задач, на будущее
кстати, парень описывает аналогичную ситуацию: http://www.youtube.com/watch?v=YlsunWT87eo#t=902
0
16.02.2014, 17:31
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
16.02.2014, 17:31
Помогаю со студенческими работами здесь

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

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

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

Параллельное выполнение метода
Здравствуйте! Пишу многопоточное приложение, в котором есть основной поток, поток управляющий...


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru