Базовые Данные много приложение потока

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

У меня есть NSURLConnection, которые загружают файл асинхронно с помощью делегата (и показывая прогресс), затем я использую XMLParser, чтобы проанализировать новые данные и создать новый NSManagedObjects в отдельном контексте с его собственным persistentStore и использованием отдельного потока.

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

Паоло иначе SlowTree

62
задан JosephH 15 December 2013 в 20:32
поделиться

2 ответа

Вопрос: Как я могу подтвердить рефакторинг, то есть математический идентичный предыдущей версии? Хотелось бы, чтобы там был инструмент, но я также принимаю «основные человеческие алгоритмы» в качестве решений.

Я согласен с CHII, что это потрясающе невозможно. Если вам действительно нужно решить его (вместо того, чтобы написать адаптер для устаревшего кода, создавая новое вещество свободно связанным со старым кодом), вы должны взять особо уход за подклассами, переопределенными методами и т. Д. Написание модулей, которые могут помочь, но Если вы на самом деле не знаете, что должен делать код, как вы можете написать тесты подразделения для него? Вы можете написать только тесты подразделений, чтобы убедиться, что новый код делает то, что вы предполагаете, что старый код сделал.

-121--2425332-

Я сделал следующее в проекте с некоторыми огромными классами Бога с необходимостью рефакторинга:

Используйте AOP, чтобы «давить» состояние объекта и параметры в начале вашего метода и в конце. Сбросьте возвращаемое значение тоже.

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

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

Дампер легко настроить с помощью инструмента, такого как xstream.

-121--2425336-

Апл-параллельность с основной документацией данных - это место для начала. Прочитайте это действительно внимательно ... Я был укушен много раз у моих недоразумений!

Основные правила:

  1. Используйте один NSPersistentStoreCoordinator на программу. Вам не нужны их на поток.
  2. Создать один nsmanageObjectContext на поток.
  3. Никогда не проходите nsmanagedObject на нити в другой поток.
  4. Вместо этого получают идентификаторы объекта через -Object и передайте его другому потоку.

Дополнительные правила:

  1. Убедитесь, что вы сохраняете объект в магазин перед получением идентификатора объекта. До сохранения, они временные, и вы не можете получить доступ к ним из другого потока.
  2. И остерегайтесь политики слияния, если вы вносите изменения в управляемые объекты из более чем одного потока.
  3. NSMANAGEDOBJECTCONTEXT S -MergeChangeSfromContextDidsaveNotification: полезно.

Но позвольте мне повторить, пожалуйста, внимательно прочитайте документ! Это действительно стоит!

151
ответ дан 24 November 2019 в 16:30
поделиться

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

Взгляните на «Лучшие песни 2» в документации Apple. С помощью этого кода я принял «красную пилюлю» Матрицы и открыл новый мир, без двойных ошибок и без ошибок. : D

Надеюсь, это поможет.

Паоло

стр. Большое спасибо Yuji, в документации, которую вы описали выше, я нашел этот пример.

2
ответ дан 24 November 2019 в 16:30
поделиться
Другие вопросы по тегам:

Похожие вопросы: