2012-08-21 3 views
0

У меня есть ситуация, когда мой UIPickerView «голодает» по задаче вычисления; другими словами, UIPickerView никогда не обновляется и, следовательно, никогда не отправляет сообщения, потому что происходит очень тяжелая вычислительная задача. Сборщик контролирует аспекты вычисления, поэтому они должны играть хорошо.UIPickerView "превентивные" сообщения?

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

Возможно ли, чтобы сборщик (или другие элементы управления пользовательского интерфейса) «упредил» выполнение блока кода? Вычисление выполняется в цикле; количество итераций - это то, что делает его тяжелым. Если сборщик может даже установить флаг где-то, цикл может сломаться сам, что будет работать с потоком программы.

Если петля может опросить сборщик, это также сработает. Но я не нашел способ сделать это.

Идеи?

(. П.с. я вчера отправил подобный вопрос, но на самом деле не спросить его правильно - не знал, что проблема была в то время)

ответ

0

Я предполагаю, что вы имеете в виду, что если флаг сборщик перемещается, устанавливает флаг. Если это так, вы можете это сделать - посмотрите на делегатов сборщика, и когда вызывается любой или все из них, установите флаг. Если ваши вычисления выполняются другим классом или классами, то создайте новое свойство в этих классах «отменено», сборщик может установить его, а когда задано окончание вычислений.

Перед тем, как начать другое вычисление, вы очистите этот флаг отмены, а затем начните вычисление.

Вы также можете разместить простую панель инструментов над сборщиком (обычная практика), где у вас есть элементы управления, которые могут запускать вычисления, показывать прогресс и отменить его.

EDIT: если проблема заключается в том, что выборщик заикается, когда пользователь пытается манипулировать им, то подкласс UIPicker, перехватывает события касания, а когда собеседник прикасается, отмените все вычисления. Единственное осложнение состоит в том, что если пользователь «вращает» сборщик, вам нужно подождать, пока он не опустится, но вы не знаете, как долго ждать. В зависимости от последнего сенсорного сообщения вам нужно будет использовать эвристику для ожидания didSelectRow: или таймаут перед перезапуском вычисления.

+0

Это была бы хорошая идея, но ... проблема в том, что сборщик didSelectRow делегат (который, как мне кажется, является единственным сообщением о действии), никогда не вызван; в основном, сборщик умирает от голода за циклы. Однако я не понимаю, как это произойдет. Я думаю, что таймер (или что бы то ни было), который обновляет сборщик, поставит в очередь сообщения. Таким образом, это может быть поздно, но в конце концов. Не имеет смысла ... –

+0

Вы установили делегат? Вы на 100% уверены, что задали делегат для своего класса, и он не сбрасывался другим объектом? Даже если вы выполняете большую работу по основному потоку, в какой-то момент вы должны получать методы делегирования. –

+0

Да, делегат работает - это уже поздно. Кое-что о вычислении задерживает его - и * просто * его. В качестве теста я создал кнопку и разместил ее в том же супер-представлении. Сообщение от кнопки может прервать вычисления просто отлично. И после обработки сообщения кнопки сборщик также обновляется. Можете ли вы придумать что-нибудь, что специально задерживало бы только сборщика? –

 Смежные вопросы

  • Нет связанных вопросов^_^