CoreData: в чем разница между executeBackgroundTask и newBackgroundContext ()? - PullRequest
0 голосов
/ 05 декабря 2018

В чем разница между этими двумя подходами?

container.performBackgroundTask { (context) in 
    // ... do some task on the context

    // save the context
    do {
        try context.save()
    } catch {
        // handle error
    }
}

и

let context = persistentContainer.newBackgroundContext()
context.perform {
    // ... do some task on the context

    // save the context
    do {
        try context.save()
    } catch {
        // handle error
    }
}

Когда использовать первый и когда использовать второй подход?

Ответы [ 2 ]

0 голосов
/ 05 декабря 2018

Разница в том, как обрабатывается параллелизм.

С performBackgroundTask ...

container.performBackgroundTask { (context) in 
    // ... do some task on the context
}

Контейнер создает новый фоновый контекст для выполнения задачи.Эта функция немедленно возвращается, поэтому, если вы вызовете ее еще раз до завершения задачи, обе задачи могут быть запущены одновременно.

С newBackgroundContext ...

let context = persistentContainer.newBackgroundContext()
context.perform {
    // ... do some task on the context
}

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

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

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

0 голосов
/ 05 декабря 2018

Не подробный ответ, но разница составляет

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

container.performBackgroundTask -> Он создаст для вас временный закрытый контекст и примет блок для выполнения

и

persistentContainer.newBackgroundContext -> Вы также можете просто получить новый закрытый контекст для использования в любом случае:

Источник https://useyourloaf.com/blog/easier-core-data-setup-with-persistent-containers/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...