iOS: запуск запроса к базе данных в viewDidLoad работает только один раз

#ios #viewdidload #viewdidappear

#iOS #viewdidload #viewdidappear

Вопрос:

Итак, давайте посмотрим, смогу ли я написать достаточно четкое описание моей проблемы…

Я разрабатываю приложение для музея, где пользователь может находить произведения искусства либо по идентификатору, либо путем сканирования qr-тега… После ввода идентификатора или сканирования тега приложение отправляет пользователя из представления поиска в информационное представление. Представление info собирает информацию об изображении из базы данных SQLite…

Моя проблема в том, что в представлении info я вызываю функцию из класса базы данных как таковую:

 - (void)viewDidLoad
{
    [super viewDidLoad];
    NSArray *paintingInfo = [[PaintingDatabase database] findPaintingByID];

    (additional code)
}
  

И у меня нет проблем с получением информации … работает нормально…
Но моя проблема в том, что если я вернусь к представлению поиска и введу новый идентификатор или отсканирую новый тег, вызов / поиск больше не выполняется, поскольку представление все еще находится в памяти…

Итак, как мне приступить к запуску

 NSArray *paintingInfo = [[PaintingDatabase database] findPaintingByID];
  

каждый раз, когда я вхожу в представление …?

Вместо этого я попытался поместить его в viewDidAppear, но я получаю ошибку EXC_BAD_ACCESS…

Ответ №1:

Я думаю, вы близки к ответу на свой собственный вопрос. Поскольку viewDidLoad вызывается только при загрузке вашего представления, если вы используете тот же ViewController, вы не получите результатов, которые ищете. Одним из вариантов может быть уничтожение и создание нового ViewController каждый раз. Вероятно, это было бы приемлемо с точки зрения производительности. Другой вариант (который вы, похоже, изучили) — поместить ваш код в viewWillAppear. Я бы, вероятно, изучил это подробнее и выяснил, что вызывает ваш сбой.

Комментарии:

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

2. Хорошо … итак, следующий вопрос… Как мне уничтожить представление? : D

3. Ну, это не представление, которое вы хотите уничтожить, а скорее контроллер представления. Где-то вы должны нажимать контроллер, чтобы показать это представление, поэтому вы хотели бы начать с этого.

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

5. Это правильное решение. Переместите код в viewWillAppear, исправьте сбой.

Ответ №2:

Это немного сложно определить из краткого описания, но мне кажется, что это скорее проблема архитектуры приложения, чем проблема с определенной функциональностью.

Возможно, вам лучше использовать альтернативный подход, запустив запрос из-за пределов информационного представления, а затем обновив свойства представления с помощью метода делегирования. Это больше похоже на подход MVC — контроллер извлекает данные из модели, затем передает данные в отображаемое представление.

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

Однако сбой не похож на проблему с представлением — я бы поддержал совет отследить это и выделить как отдельную проблему.