2017-01-25 1 views
0

Прежде чем вы прочитаете, учтите, что я нахожусь на ранней стадии разработки iOS :) У меня есть класс SomeManager, который манипулирует данными с помощью инфраструктуры Core Data в моем приложении iOS. Я создал инициализатор для этого менеджера таким образом:Запустите инициализатор классов для Core Data Manager в Swift

class UserManager { 
    private let appDelegate: AppDelegate 
    private let context: NSManagedObjectContext 

init() { 
    self.appDelegate = UIApplication.shared.delegate as! AppDelegate 
    self.context = self.appDelegate.persistentContainer.viewContext 
} 

Далее у меня есть некоторые методы, которые выполняют, что манипуляции с пользователем NSManagedObject класса.

У меня есть 2 вопроса. 1. Правильно ли это? 2. Где (на каком этапе) я должен реализовать многопоточность (по GCD) для моего Менеджера? Должен ли я делать это в инициализаторе или в методах диспетчера? Или в ViewController?

Спасибо за ваши ответы

ответ

0

Это звучит как несколько вопросов, которые здесь происходят. Трудно сказать, что такое «Правильно», но есть более или менее архитектурно обоснованные решения.

Вопрос 1

Для простых случаев:

Если вы собираетесь быть только чтение из CoreData, или делают пишет очень легкий вес (и, возможно, даже не против приложение UI замерзает на мгновение в худшем случае), так как context = persistentContainer.viewContext может работать нормально (при условии, что appDelegate.persistentContainer уже был создан где-то еще).

Для корпоративных архитектурных дел:

Если вы ищете в MVVM/MVP/VIPER, как правило, конкретный код CoreData находится в своем собственном классе, чей сингл ответственность заключается в управлении, как Data входит и выходит , Так что класс будет знать, какие контексты использовать, когда. Обычно записи будут в фоновом режиме, используя persistentContainer.performBackgroundTask, если вам не нужно больше контроля, создавая собственные контексты.

Вопрос 2

Вы должны начать использовать многопоточность, когда вы Noice ваш пользовательский интерфейс заболачивания вниз, или у вас есть много записей (и навалочных записи) происходит. persistentContainer велик, хотя, потому что вы можете бросить вещи на заднем плане и не беспокоиться о создании и управлении другими потоками самостоятельно:

persistentContainer.performBackgroundTask{ context in 
    //do some stuff on a background thread 
    let person = Person(context: context) //creating a person for example 

    try! context.save() //this will save that Person to the database 

    //returning to the UI Thread 
    DispatchQueue.main.async { 
     //tell the UI thread to do something 
    } 
} 

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

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