Arhn - архитектура программирования

Лучшая практика для длительной операции переднего плана, использующей Core Data?

У меня есть приложение, которое импортирует потенциально большой объем данных из Интернета после того, как пользователь явно нажимает кнопку синхронизации, и сохраняет эти данные с помощью Core Data. Поскольку я хочу показать отзыв и не хочу, чтобы пользователь взаимодействовал с остальной частью приложения, пока это происходит, нажатие кнопки «Синхронизировать» вызывает модальное диалоговое окно. Поскольку я хочу, чтобы операция выполнялась немедленно, она выполняется в методе viewDidAppear. Я уверен, что это осуждается.

Сейчас есть куча проблем с подходом:

  • Everything happens in the main thread. The user kind of gets feedback because there is an activity indicator that continues to animate, but there's no way to indicate progress or show intermediate messages. This is not the right way to do things.
    • But, I am told that when using Core Data, everything has to use the main thread, so breaking off the work into another thread does not seem like it will be straightforward.
  • If the app enters the background state (user hits Home button or iPad falls sleep), it's game over - the operation dies. It's clear to me from the documentation why this is the case.
    • I know there are "I'm about to enter the background" events that you can handle, but it's not as though I can move execution of code from one place to another in the middle of a file download. Whatever solution I use has to be a continuous action that executes in the same way both before and after the transitions to/from the background.
    • Я хочу, чтобы операция выполнялась на переднем плане для пользователя. Им не имеет смысла взаимодействовать с другими частями приложения, пока выполняется эта операция.

Я читаю документацию Apple по этому вопросу, но я спрашиваю об этом в надежде найти более краткое руководство по этой конкретной комбинации потребностей. Спасибо.


  • Ваше утверждение о Core Data, требующем основного потока, неверно. Прочтите раздел о параллелизме в: developer.apple. com/library/ios/#documentation/Cocoa/Conceptual/ 03.05.2012
  • @T Редди Ты прав. Мое утверждение верно только в том случае, если я попытаюсь передать контекст управляемого объекта основного потока рабочему потоку. Если я создаю новый контекст управляемого объекта в рабочем потоке, это поддерживается (мне просто нужно убедиться, что я делаю что-то, чтобы контекст объекта управления основного потока знал об изменениях, внесенных рабочим контекстом). 04.05.2012
  • Не только контекст, но и любой управляемый объект не может пересекать границы потока. Я использовал эту оболочку управляемых объектов, чтобы упростить требования к многопоточности, как указано в документации Core Data: github.com/chriscdn/ RHManagedObject 04.05.2012

Ответы:


1

Вы действительно не должны замораживать основной поток. Вы по-прежнему можете «запретить» определенные действия пользовательского интерфейса.

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

NSManagedContext *backgroundContext = [NSManagedContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType];
backgroudContext.parentContext = [self mainManagedObjectContext];
[backgroundContext performBlock:^{
    // This block is running in a background thread.
    // Go get your data from the web

    // Call this to push data to the main MOC (either at end, or at intervals)
    [backgroundContext save:&error];

    // When you want to do something on the main thread...
    dispatch_async(dispatch_get_main_queue(), ^{
        // This block is running on the main queue... I can do anything with the UI...
    }];
}];

Пара вещей, на которые следует обратить внимание... ваш mainMOC должен быть частным или основным типом параллелизма очереди. Если вы используете шаблон Core Data, где он находится в делегате приложения, просто измените alloc/init на initWithConcurrencyType:NSMainQueueConcurrencyType.

Однако я бы предложил использовать канонические отношения main/parent. Создайте частный MOC, назначьте его постоянному хранилищу, затем создайте основной MOC, установите его родительский объект в качестве этого частного MOC. Теперь вы готовы обрабатывать любые операции ввода-вывода в фоновом режиме, не блокируя пользовательский интерфейс.

Тем не менее, при загрузке из Интернета используйте приведенный выше шаблон: создайте дочерний MOC, затем загрузите объекты в основной MOC.

Обратите внимание, что данные не сохраняются на диск до тех пор, пока «корневой» MOC не вызовет save.

08.05.2012
Новые материалы

Коллекции публикаций по глубокому обучению
Последние пару месяцев я создавал коллекции последних академических публикаций по различным подполям глубокого обучения в моем блоге https://amundtveit.com - эта публикация дает обзор 25..

Представляем: Pepita
Фреймворк JavaScript с открытым исходным кодом Я знаю, что недостатка в фреймворках JavaScript нет. Но я просто не мог остановиться. Я хотел написать что-то сам, со своими собственными..

Советы по коду Laravel #2
1-) Найти // You can specify the columns you need // in when you use the find method on a model User::find(‘id’, [‘email’,’name’]); // You can increment or decrement // a field in..

Работа с временными рядами спутниковых изображений, часть 3 (аналитика данных)
Анализ временных рядов спутниковых изображений для данных наблюдений за большой Землей (arXiv) Автор: Рольф Симоэс , Жильберто Камара , Жильберто Кейрос , Фелипе Соуза , Педро Р. Андраде ,..

3 способа решить квадратное уравнение (3-й мой любимый) -
1. Методом факторизации — 2. Используя квадратичную формулу — 3. Заполнив квадрат — Давайте поймем это, решив это простое уравнение: Мы пытаемся сделать LHS,..

Создание VR-миров с A-Frame
Виртуальная реальность (и дополненная реальность) стали главными модными терминами в образовательных технологиях. С недорогими VR-гарнитурами, такими как Google Cardboard , и использованием..

Демистификация рекурсии
КОДЕКС Демистификация рекурсии Упрощенная концепция ошеломляющей О чем весь этот шум? Рекурсия, кажется, единственная тема, от которой у каждого начинающего студента-информатика..