2

В настоящее время я разбираю все мои данные из JSON и сохраняю их в массиве. Однако, когда он начинает разбираться, использование памяти скапливается примерно с 25 МБ до 800 МБ. После выполнения некоторых исследований мне сказали, чтобы поставить @autoreleasepool в блок GCD, но безрезультатно.Использование большой памяти при разборе JSON

Вот код, который я получил до сих пор:

self.channelSchedules = [NSMutableArray new]; 
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ 
    // Add code here to do background processing 
    //Loop through each channel object and download schedule 
    @autoreleasepool { 
     for (atlas_channel* channel in self.channels) { 
      NSLog(@"Updating listings for %@", [channel getChannelTitle]); 
      [self.channelSchedules addObject:[[channel getChannelSchedule] returnCurrentContentObject]]; 
      [self.tableView reloadData]; 
      [self scrollViewDidScroll:nil]; 
     } 
    } 
    dispatch_async(dispatch_get_main_queue(), ^{ 
     // Add code here to update the UI/send notifications based on the 
     // results of the background processing 
     [self.tableView reloadData]; 
    }); 
}); 

Я использую TouchJSON для анализа данных.

При дальнейших исследованиях я думаю, что это связано с тем, что я сохраняю все значения после разбора в NSArray, который сохраняет каждый объект в памяти. Я думаю, что мне придется использовать CoreData или что-то в этом роде.

+0

Если ваш autoreleasepool находится внутри цикла for, вы получите утечку на каждой итерации. Там могут быть лучшие способы разработки этого кода, чтобы избежать памяти, но это может быть быстрым решением. – KirkSpaziani

+0

Он сократил вдвое примерно до 400 мб. Это все еще кажется довольно высоким, хотя –

+1

сколько данных вы разбираете? @autoreleasepool здесь бесполезен (не все ваше приложение под @autoreleasepool?) – Ali

ответ

1

Использование высокой памяти было связано с тем, что я сохранял элементы JSON в NSArray, который сохраняет себя в памяти. Я смог обойти это, используя область, чтобы кэшировать мои объекты на диск и называть их, когда это необходимо, как предлагалось EricS. В настоящее время приложение использует 32 МБ, что намного лучше.

2

Только вызов [self.tableView reloadData] на mainThread.

+0

К сожалению, это не помогает в решении проблемы с памятью. –

2
  1. Доступен ли вы один и тот же изменяемый массив из двух потоков одновременно? Это не будет работать надежно.

  2. Как кто-то сказал, не обновляйте таблицу из фонового потока.

  3. Насколько велики файлы JSON? Вы по существу сохраняете все данные в ОЗУ менее эффективным образом, поэтому ожидайте в два раза больше использования памяти в качестве исходного текста.

  4. Попробуйте анализатор JSON от Apple.

+0

1. Да, хотя я рассматриваю возможность перехода от использования массива к основным данным или к чему-то подобному. 2. Я удалил это сейчас. 3. Каждый файл JSON составляет около 0.14mb, что почти ничего, но я должен загрузить около 400-450 из этих файлов. 4. Сначала я использовал парсер Apple JSON, но он разбился каждый раз, когда был ноль, поэтому я переключился. –

+1

Если вам не нужны все декодированные данные за один раз, вам может быть лучше просто сохранить 400 файлов в вашей папке «Документы» или «Кэш» и декодировать их по мере необходимости. – EricS

+0

Вот что я сейчас делаю сейчас. Я собираюсь хранить данные с помощью Core Data. Я расскажу о том, как это происходит. –

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

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