Сохранение точек расположения CLLocation в массиве вызывает проблемы с памятью и производительностью - PullRequest
2 голосов
/ 09 января 2011

У меня возникла небольшая проблема с приложением iPhone runkeeper. Практически во всех случаях приложение работает нормально, я разработал его так, чтобы добавить объекты CLLocation в массив, а затем сохранить этот массив объектов в базе данных MySQL. Затем, когда я открываю представление карты, я просто извлекаю массив с сервера и, немного манипулируя, использую данные для добавления выводов на карту.

Как я уже сказал, все это работает нормально и прекрасно работает на симуляторе и на устройстве, сидя за моим столом (и, между прочим, используя инструменты - без утечек). Однако, когда я протестировал приложение на устройстве и фактически вышел из дома и прошел 15 минут по улице, приложение вылетает в тот момент, когда объект CLLocationManager перестает обновляться и массив помещается в MySQL - почти наверняка (думаю) из-за проблем с памятью.

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

Вот (выборка) кода, который я использую:

- (void)locationManager:(CLLocationManager *)manager
    didUpdateToLocation:(CLLocation *)newLocation
           fromLocation:(CLLocation *)oldLocation {

// примечание Я вынул код, определяющий, является ли объект CLocation допустимым, а также одну или две другие мелочи

    if (recording == YES) {//the start button has been pressed but the stop button hasn't.


        if (alreadyBeenRound == NO) {

            if (firstRecord == YES) {

                //create the pointsonRoute array
                if (pointsOnRouteExists == NO) {

                    pointsOnRoute = [[NSMutableArray alloc] init];
                    pointsOnRouteExists = YES;
                }

                [pointsOnRoute removeAllObjects];

                firstRecord = NO; //after setting first record, can move on

            }

            [pointsOnRoute addObject:newLocation];

                            //more stuff taken out here

            alreadyBeenRound = YES;

        } else { 

            [pointsOnRoute addObject:newLocation];


        }

//I do release the array

Ответы [ 2 ]

0 голосов
/ 03 июля 2015

Вы должны хранить только основные обновления.Допустим, вы будете хранить каждые 5 метров разницы на первом километре (если пользователь просто прогуливается), а затем каждые 20-50 метров, если они пробежали.Вы также можете обрезать некоторые близкие значения или значения в одном направлении в фоновом потоке, если ваш массив / CoreData начнет значительно расти.

0 голосов
/ 09 января 2011

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

...