Как я могу остановить / убить ультралитический оператор SELECT?
Просто интересно, можно ли отменить или остановить оператор выбора?
У меня есть приложение с базой данных Sap Ultralite. Соединения с базой данных и операторы обрабатываются в пределах одного.
у меня есть ViewController
где я начинаю тяжелую READ
-операция в фоновом режиме, которая иногда занимает до 2-3 с. В то же ViewController
, вы можете изменить некоторые значения и сохранить его с WRITE
-операция, которая отклоняет ViewController
,
Моя проблема в том, что если я действительно быстр и / или READ
очень медленная, мой ViewController не закрывается, потому что WRITE
операция ждет конца READ
-operation. Таким образом, пользовательский интерфейс зависает на пару секунд.
Благодаря моим навыкам поиска в Google или плохой документации на ультралите, кто-нибудь знает, как я могу отменить текущий текущий SELECT
-заявление? (Результат больше не важен, потому что View будет отклонен) Или как я могу разрешить несколько операторов одновременно? READ
а также WRITE
операции, работающие с разными таблицами, если это важно
РЕДАКТИРОВАТЬ: (обобщить вопросы)
- Это возможно
READ
а такжеWRITE
одновременно с ультралитом? - Если нет, есть ли другие решения? (На данный момент мы тестируем на дублирование базы данных)
ОБНОВЛЕНИЕ (подробно): Хорошо, мы нашли обходной путь, но это не отвечает на вопрос.
У нас есть приложение с ShoppingCard ListView
(предметы хранятся в ультралитовой базе данных). В этом представлении вы можете изменить элементы (изменить дату доставки, номер суммы...) в течение Freeform-ViewController
который показывает некоторые статистические данные.
Статистика тяжелая READ
операция, которая иногда занимает до пяти секунд. Так что если вы, например, измените количество предметов и нажмите DONE
кнопка, Freeform-ViewController
начинает WRITE
-операция (ОБНОВЛЕНИЕ), удаляется, а ShoppingCard обновляется (снова READ
в базу данных, чтобы получить изменения).
Последний пункт был плохим, но мы реализовали обработчик завершения для FreeformVC
, который обновляет только один элемент вместо READ
вся карта покупок из базы данных. Кажется, это работает, но это не лучшее решение. Если вы нажимаете очень быстро, вы иногда чувствуете задержку, если хотите снова прочитать из базы данных, поэтому вопрос остается...
1 ответ
Прежде всего переместите код запроса к вашей базе данных в другую очередь (это хорошая практика)
Решение: начните ставить в очередь операции с вашей базой данных. Это очень простое решение, трюк в том, чтобы отправлять запросы к вашей базе данных в другую очередь.
// Ваша операция чтения dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), ^{ // Запрос здесь //.... // Возвращаемся в главную очередь dispatch_async(dispatch_get_main_queue(), ^{ // Обновить пользовательский интерфейс }); });
После этого ваши операции записи делают то же самое
dispatch_async (dispatch_get_global_queue (DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), ^ { // Операция записи // .... });
Это решение не отменяет операцию чтения, но пользовательский интерфейс больше не останавливается (ViewController будет отклонять, но операции будут продолжаться до тех пор, пока они не завершатся).
Другой возможный способ: поскольку база данных ultralite не задокументирована... Я думаю, что один из возможных способов - это уничтожить и создать экземпляр менеджера (изменив ваш синглтон-класс на non-singleton), если это не приведет к сбою, он отменит выполнение операция.
Другой возможный способ: использовать NSOperations и попытаться отменить операцию... возможно, "ultralite" проверит отмененное состояние и остановит запрос.