рдХреЛрд░ рдбреЗрдЯрд╛ рдХреЗ рд╕рд╛рде рд╢реБрд░реВ! рд╕рд░рд▓ рд╢рдмреНрджреЛрдВ рдореЗрдВ рдХрдард┐рди [рднрд╛рдЧ реи]

рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ, рдореИрдВ рдХреЛрд░ рдбреЗрдЯрд╛ рдХреА рдХреНрд╖рдорддрд╛рдУрдВ рдХреЛ рдФрд░ рдкреНрд░рдХрдЯ рдХрд░рдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛ред рдпрд╣ рд▓реЗрдЦ рдПрдХ рдирд┐рд░рдВрддрд░рддрд╛ рд╣реИ ред рдореИрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЖрд╢рд╛ рдХрд░рддрд╛ рд╣реВрдВ рдХрд┐ рдореБрдЭреЗ рдпрд╣ рд╡рд┐рдЪрд╛рд░ рдорд┐рд▓ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдХреЛрд░ рдбреЗрдЯрд╛ рдХрдИ рд░рд┐рд▓реЗрд╢рдирд▓ рдбреЗрдЯрд╛рдмреЗрд╕реЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдирд╣реАрдВ рд╣реИ, рдмрд▓реНрдХрд┐ рдПрдХ рдмрд╣реБрдд рд╢рдХреНрддрд┐рд╢рд╛рд▓реА рдЙрдкрдХрд░рдг рд╣реИ рдЬреЛ рдХрд┐рд╕реА рднреА рд╕реНрд╡рд╛рднрд┐рдорд╛рдиреА рдЖрдИрдУрдПрд╕ рдбреЗрд╡рд▓рдкрд░ рдХреЗ рд╢рд╕реНрддреНрд░рд╛рдЧрд╛рд░ рдореЗрдВ рдПрдХ рдЕрднрд┐рдиреНрди рд╣рдерд┐рдпрд╛рд░ рдмрди рд╕рдХрддрд╛ рд╣реИред

рдареАрдХ рд╣реИ, рдЪрд▓реЛ рд╢реБрд░реВ рд╣реЛ рдЬрд╛рдУ!

рдЖрдЬ рд╣рдо рджреЛ NSManageObjectContext рдФрд░ NSFetchedResultsController рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░ рд░рд╣реЗ рд╣реИрдВред

рджреЛ NSManageObjectContext рдФрд░ рдЗрд╕рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреНрдпреЛрдВ рд╣реИ?


рдпрджрд┐ рдЖрдкрдХрд╛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╕рдХреНрд░рд┐рдп рд░реВрдк рд╕реЗ рдХрд┐рд╕реА рднреА рдПрдкреАрдЖрдИ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ рдЬрд┐рд╕рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╡рд╣ рдбреЗрдЯрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдЖрдк рдЗрд╕ рдбреЗрдЯрд╛ рдХреЛ рдХрд╣реАрдВ рдФрд░ рд╕рд╣реЗрдЬрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдХреЛрд░ рдбреЗрдЯрд╛ рдПрдХ рдЙрддреНрдХреГрд╖реНрдЯ рд╡рд┐рдХрд▓реНрдк рд╣реИред рдЗрд╕рд╕реЗ рдЖрдкрдХреЛ рдХреНрдпрд╛ рд╕рдорд╕реНрдпрд╛рдПрдВ рд╣реЛ рд╕рдХрддреА рд╣реИрдВ? рдкрд╣рд▓рд╛ рдФрд░ рд╕рдмрд╕реЗ рд╕реНрдкрд╖реНрдЯ - рдбреЗрдЯрд╛ рдХреА рдорд╛рддреНрд░рд╛ рдЗрддрдиреА рдмрдбрд╝реА рд╣реЛрдЧреА рдХрд┐ рдЬрдм рдЖрдк рдЙрдиреНрд╣реЗрдВ рдмрдЪрд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдВрдЧреЗ, рддреЛ рд╣рдорд╛рд░рд╛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреБрдЫ рд╕рдордп рдХреЗ рд▓рд┐рдП рдлреНрд░реАрдЬ рд╣реЛ рдЬрд╛рдПрдЧрд╛, рдЬреЛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рдЕрдиреБрднрд╡ рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░реЗрдЧрд╛ред рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдЬреАрд╕реАрдбреА рдХреЛ рд╕реНрд╡рддрдВрддреНрд░ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рд╕реНрд╡рддрдВрддреНрд░ рд╣реИ, рд╣рдорд╛рд░рд╛ рдХреЛрд░ рдбреЗрдЯрд╛ рд╕реНрдЯреИрдХ, рдЬрд┐рд╕рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдпрд╣рд╛рдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ , рд╕рдордХрд╛рд▓рд┐рдХ рд░реВрдк рд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдФрд░ рд╣рдорд╛рд░реЗ NSManageObjectContext рдореЗрдВ рдХрд┐рд╕реА рднреА рдПрдХреНрд╕реЗрд╕ рдХреЗ рд▓рд┐рдП рд╣рдореЗрдВ рд▓реВрдк рдХреЗ рдЕрдВрдд рддрдХ рдЗрдВрддрдЬрд╛рд░ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред

рд▓реЗрдХрд┐рди рдпрд╣рд╛рдБ рдирд┐рдЬреА NSManageObjectContext рдЬреЛ рдмреИрдХрдЧреНрд░рд╛рдЙрдВрдб рдереНрд░реЗрдб рдореЗрдВ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рдмрдЪрд╛рд╡ рдХреЗ рд▓рд┐рдП рдЖрддрд╛ рд╣реИред рдЗрд╕реЗ рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдкрд╣рд▓реЗ рд╣рдорд╛рд░реЗ NSPersistentContainer рд╕реЗ рд╕рдВрдкрд░реНрдХ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред

рдЗрд╕ рддрд░рд╣ рджрд┐рдЦреЗрдЧрд╛ рдЗрдирд┐рд╢рд┐рдПрдЯрд┐рд╡:

lazy var persistentContainer: NSPersistentContainer = {
    let container = NSPersistentContainer(name: "Preset")
    container.loadPersistentStores { (persistent, error) in
        if let error = error {
            fatalError("Error: " + error.localizedDescription)
        }
    }
    container.viewContext.mergePolicy = NSMergeByPropertyStoreTrumpMergePolicy
    container.viewContext.shouldDeleteInaccessibleFaults = true
    container.viewContext.automaticallyMergesChangesFromParent = true
    return container
}()

Mergepolicy


рдпрд╣рд╛рдВ рдЖрдк рд╣рдорд╛рд░реЗ NSManageObjectContext рдХреА рдорд░реНрдЬ рдиреАрддрд┐ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рддреЗ рд╣реИрдВред рдпрд╣рд╛рдВ рд╣рдо рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдЗрдВрдЧрд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рдбреЗрдЯрд╛ рд╕рдВрдШрд░реНрд╖ рдХреА рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдХреЛрд░ рдбреЗрдЯрд╛ рдХреЛ рдХреИрд╕реЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред

MergePolicy рд╡рд┐рдХрд▓реНрдк:

  1. NSRollbackMergePolicy - рд╕рдВрдШрд░реНрд╖ рдХреА рд╕реНрдерд┐рддрд┐ рдореЗрдВ, рдкреНрд░рдХрдЯ рд╣реЛрдиреЗ рддрдХ рд╕рднреА рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреЛ рдЫреЛрдбрд╝ рджреЗрддрд╛ рд╣реИ
  2. NSOverwriteMergePolicy - рдбреЗрдЯрд╛ рдХреА рдкрд░рд╡рд╛рд╣ рдХрд┐рдП рдмрд┐рдирд╛ рдирдП рдореВрд▓реНрдпреЛрдВ рдХреЛ рдмрдЪрд╛рддрд╛ рд╣реИ
  3. NSMergeByPropertyStoreTrumpMergePolicy - рд╕рдВрдкрддреНрддрд┐ рджреНрд╡рд╛рд░рд╛ рд╕рдВрдкрддреНрддрд┐ рдмрджрд▓ рд╕рдВрдкрддреНрддрд┐ рдмрдЪрд╛рддрд╛ рд╣реИ, рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдмрдЪрд╛рдпрд╛ рдбреЗрдЯрд╛ рдкреНрд░рдмрд▓ рд╣реЛрдЧрд╛
  4. NSMergeByPropertyObjectTrumpMergePolicy - рд╕рдВрдкрддреНрддрд┐ рджреНрд╡рд╛рд░рд╛ рд╕рдВрдкрддреНрддрд┐ рдмрджрд▓ рд╕рдВрдкрддреНрддрд┐ рдмрдЪрд╛рддрд╛ рд╣реИ, рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдирдпрд╛ рдбреЗрдЯрд╛ рдкреНрд░рдмрд▓ рд╣реЛрдЧрд╛

AutomaticallyMergesChangesFromParent - рдХрд╣рддрд╛ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рд╣рдорд╛рд░рд╛ рд╕рдВрджрд░реНрдн рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдбреЗрдЯрд╛ рдорд░реНрдЬ рдХрд░ рджреЗрдЧрд╛ред
рдлрд┐рд░ рдПрдХ рдирдпрд╛ рд╕рдВрджрд░реНрдн рдмрдирд╛рдПрдВ ред

let context = persistentContainer.viewContext
let context = persistentContainer.newBackgroundContext()

рдЕрдм рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рджреЛ NSManageObjectContext рд╣реИрдВред рдкрд╣рд▓рд╛ рдпреВрдЖрдИ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣реИ рдФрд░ рдореБрдЦреНрдп рдзрд╛рдЧреЗ рдкрд░ рдЪрд▓рддрд╛ рд╣реИ, рдФрд░ рджреВрд╕рд░реЗ рдореЗрдВ рдмреИрдХрдЧреНрд░рд╛рдЙрдВрдб рдореЗрдВ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП PrivateQueueConcurrencyType рд╣реИред

рд╣рдо рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдбреЗрдЯрд╛ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд░реЗрдВрдЧреЗред

let object = NSEntityDescription.insertNewObject(forEntityName: "Name", into: context)
saveChanges(with: context)

рдпрд╣рд╛рдВ рд╣рдо рдЕрдкрдиреА рдЗрдХрд╛рдИ рдмрдирд╛рддреЗ рд╣реИрдВ рдФрд░ рдлрд┐рд░ рд╣рдо рдЗрд╕рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рдЧреБрдг рдкреНрд░рджрд╛рди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЬрд┐рд╕рдХреЗ рдмрд╛рдж рд╣рдо рд╕реЗрд╡ рд╡рд┐рдзрд┐ рдХреЛ рдХреЙрд▓ рдХрд░рддреЗ рд╣реИрдВ, рдпрд╣ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:

func saveChanges(with context: NSManagedObjectContext) {
        context.performAndWait {
            if context.hasChanges {
                do {
                    try context.save()
                } catch {
                    context.rollback()
                }
            }
            context.reset()
        }
    }

рдЪреБрдирдиреЗ рдХреЗ рд▓рд┐рдП 2 рддрд░реАрдХреЗ рд╣реИрдВ:

  • PerformAndWait - рд╕рдордХрд╛рд▓рд┐рдХ рд░реВрдк рд╕реЗ рд╕рдВрджрд░реНрдн рдереНрд░реЗрдб рдкрд░ рдХреНрд░рд┐рдпрд╛ рдХрд░рддрд╛ рд╣реИ
  • рдкреНрд░рджрд░реНрд╢рди - рд╕рдВрджрд░реНрдн рд╕реНрдЯреНрд░реАрдо рдкрд░ рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреЛ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рд░реВрдк рд╕реЗ рдХрд░рддрд╛ рд╣реИ


NSFetchedResultsController


NSFetchedResultsController - рдПрдХ рдирд┐рдпрдВрддреНрд░рдХ рдЬреЛ рдХреБрдЫ рдЕрдиреБрд░реЛрдз рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рдЖрд╡рд╢реНрдпрдХ рдбреЗрдЯрд╛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддрд╛ рд╣реИред

lazy var fetchedResultsController: NSFetchedResultsController<Pack> = {
        let fetchRequest = NSFetchRequest<Pack>(entityName:"Pack")
        fetchRequest.fetchBatchSize = 20
        fetchRequest.sortDescriptors = [NSSortDescriptor(key: "name", ascending:true)]
        let controller = NSFetchedResultsController(fetchRequest: fetchRequest, managedObjectContext: context, sectionNameKeyPath: nil, cacheName: nil)

        controller.delegate = self
        do {
            try controller.performFetch()
        } catch {
            print(error.localizedDescription)
        }
        return controller
    }()

NSFetchedResultsController рдХреЗ рд╡рд┐рдиреНрдпрд╛рд╕ рдХреА рдПрдХ рдмрдбрд╝реА рд╕рдВрдЦреНрдпрд╛ рд╣реИ, рд╣рдо рдЙрдирдореЗрдВ рд╕реЗ рдХреБрдЫ рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░реЗрдВрдЧреЗ:

Fetchlimit
FetchLimit тАФ

Sketchoffset
FetchOffset тАФ . 2, .

FetchbatchSize
FetchBatchSize тАФ . Table/CollectionView 5 , 7 , .

FetchbatchSize
FetchBatchSize тАФ .

SortDescriptor
SortDescriptor тАФ , .

ReturnsObjectsAsFaults
ReturnsObjectsAsFaults тАФ , , , PersistentStore RawCache

рдлрд┐рд▓рд╣рд╛рд▓, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ NSFetchedResultsController рд╣реИ рдЬреЛ рдПрдХ рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рд╣рдорд╛рд░реЗ рдбреЗрдЯрд╛ рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рдбреЗрдЯрд╛ рдХреЛ рдЕрджреНрдпрддрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЛ рдкреНрд░рддрд┐рдирд┐рдзрд┐ рд╡рд┐рдзрд┐ рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:

extension ViewController: NSFetchedResultsControllerDelegate {
    func controller(_ controller: NSFetchedResultsController<NSFetchRequestResult>, didChange anObject: Any, at indexPath: IndexPath?, for type: NSFetchedResultsChangeType, newIndexPath: IndexPath?) {
       collectionView.reloadData()
    }
}

рдпрд╣ рдкреНрд░рддрд┐рдирд┐рдзрд┐ рдкрджреНрдзрддрд┐ рддрдм рдХрд╛рдо рдХрд░рддреА рд╣реИ рдЬрдм рд╣рдорд╛рд░реЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рдХреЛрдИ рдмрджрд▓рд╛рд╡ рд╣реЛрддрд╛ рд╣реИред рдЗрд╕ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ, рдпрд╣ рддрдм рд╣реЛрддрд╛ рд╣реИ рдЬрдм рд╣рдо рдбреЗрдЯрд╛ рдХреЛ рдПрдХ PrivateContext рдореЗрдВ рд╕рд╣реЗрдЬрддреЗ рд╣реИрдВред рдЗрд╕ рд╕рдордп, рдкреНрд░рддрд┐рдирд┐рдзрд┐ рдкрджреНрдзрддрд┐ рдЪрд╛рд▓реВ рд╣реЛ рдЬрд╛рддреА рд╣реИ рдФрд░ рдбреЗрдЯрд╛ рдЕрдкрдбреЗрдЯ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред

рдмрд╕ рдПрдХ рдирд┐рдпрдорд┐рдд рдбреЗрдЯрд╛рдмреЗрд╕ рд╕реЗ рдХреБрдЫ рдХреНрд░рд┐рдпрд╛рдПрдВ рдФрд░ рдХреЛрд░ рдбреЗрдЯрд╛ рдХрд┐рд╕реА рднреА рдЖрдИрдУрдПрд╕ рдбреЗрд╡рд▓рдкрд░ рдХреЗ рд╢рдХреНрддрд┐рд╢рд╛рд▓реА рд╣рдерд┐рдпрд╛рд░ рдореЗрдВ рдмрджрд▓ рдЬрд╛рддрд╛ рд╣реИред

рд╣реИрдкреНрдкреА рдХреЛрдбрд┐рдВрдЧ!

All Articles