При закрытии просмотра, который запустил службу определения местоположения, возникает ошибка уведомления

Я создал небольшое приложение, в основе которого лежит этот проект:
https://github.com/dsdavids/TTLocationHandler
И он работал нормально, пока я не переместил службы определения местоположения из другого представления в приложении.

Что делает приложение: Когда оно запущено можно нажать на кнопку СТАРТ и (в эмуляторе локации должна быть включена) на карте маршрут движения отображается по мере движения.
Проблема возникла, когда я перенес начальное действие во второй вид .
В этом втором представлении я просто хочу запустить службу определения местоположения и закрыть ее.
Проблема в том, что когда я начинаю поиск во втором представлении, я получаю сообщение об ошибке (сбой приложения EXC_BAD) здесь:

TTLocationHandler
...
dispatch_async(dispatch_get_main_queue(), ^{
        if (OUTPUT_LOGS) NSLog(@"Sending notification out");
        NSNotification *aNotification = [NSNotification notificationWithName:LocationHandlerDidUpdateLocation object:[locationToSave copy]];
        [[NSNotificationCenter defaultCenter] postNotification:aNotification];
    });
...

Я думаю, это потому, что я закрываю второе представление (представление, которое запустило службу), а TTLocationHandler все еще пытается что-то ему отправить.
Для лучшего понимания моей проблемы я добавил проект в git hub:
https://github.com/1110/common-location-features

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

Я был бы очень благодарен, если бы кто-нибудь нашел немного времени, чтобы сказать мне, что я делаю неправильно, поскольку я уверен, что это какая-то мелочь, которую я, вероятно, делаю неправильно.

Весь код находится в SecondViewController.m

Спасибо


person 1110    schedule 29.05.2014    source источник


Ответы (1)


Проблема, вероятно, заключается в том, что диспетчер местоположения отправляет обновления местоположения объекту, которого больше не существует.

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

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

person Jeff Loughlin    schedule 29.05.2014
comment
Да, я понимаю. В случае моего основного представления (никогда не освобождаемого) все работает нормально. Но в случае второго представления, которое я отклоняю после запуска службы определения местоположения, менеджер местоположения пытается отправить что-то его создателю. Моя проблема в том, что я должен запускать службы определения местоположения из этого представления, которое будет закрыто после запуска службы определения местоположения. Есть ли какой-то другой подход, который я могу сделать? Возможно, для этого есть какой-то шаблон, но я понятия не имею :( - person 1110; 30.05.2014
comment
Сделайте что-то помимо вашего второго представления CLLocationManagerDelegate - любой объект может быть делегатом. Я бы предложил, чтобы ваш основной вид содержал объект диспетчера местоположения и был для него делегатом. Передайте указатель на этот объект во второе представление, затем вы сможете делать оттуда все, что вам нужно, используя указатель на свое основное представление и его менеджер местоположения. - person Jeff Loughlin; 30.05.2014
comment
Основываясь на вашем комментарии, я создал один класс singleton и запустил в нем службы определения местоположения, теперь он работает, но я не знаю, насколько это хорошее решение, и я хочу попробовать это с решением pointer. Можете ли вы добавить код о том, как передать указатель на второе представление, пожалуйста? Я предполагаю, что это будет ссылка во втором представлении на объект в первом представлении. - person 1110; 30.05.2014