Základní Údaje Výkon: 6 tipů, které byste měli vědět

Písemně Základní Údaje kód s výkonem v paměti, pomáhá připravit své aplikace pro budoucnost. Vaše databáze může být na začátku malá, ale může snadno růst, což má za následek pomalé dotazy a snížené zkušenosti pro uživatele.

od té doby, co jsem začal psát aplikaci Collect by WeTransfer v roce 2017, jsem psal spoustu klíčových dat souvisejících s kódem a dotýkal se ho téměř každý den. S miliony uživatelů, kteří přidávají spoustu obsahu, provádění kódu týkajícího se základních dat se stalo důležitou dovedností v našem týmu.

Architektuře SwiftUI aplikace s MVC a MVVMAlthough můžete vytvořit aplikaci, jednoduše tím, že hodí nějaký kód, spolu, bez osvědčených postupů a robustní architekturu, budete brzy skončit s nezvladatelným špagety kód. Naučte se, jak vytvořit solidní a udržovatelné aplikace s menším počtem chyb pomocí tohoto bezplatného průvodce.

v průběhu let jsme vyvinuli spoustu poznatků, o které se s vámi rád podělím prostřednictvím 5 tipů, které byste měli vědět.

1: Využijte kontext objektu spravovaného na pozadí

jedna věc, kterou jsme od začátku neměli, je využití kontextu objektu spravovaného na pozadí. Kontext zobrazení jsme použili pouze k provádění jakýchkoli základních úkolů souvisejících s daty: vkládání nového obsahu, mazání obsahu, načítání obsahu atd.

na začátku byla naše aplikace relativně malá. Využití pouze kontextu pohledu nebylo ve skutečnosti problémem a nevedlo k žádným viditelným výkonnostním sankcím týkajícím se základních dat. Je zřejmé, že jakmile naše aplikace začala růst, uvědomili jsme si, že kontext zobrazení byl spojen s hlavní frontou. Pomalé dotazy blokovaly naše uživatelské rozhraní a naše aplikace začala méně reagovat.

obecně platí, že nejlepší praxí je provádět zpracování dat ve frontě na pozadí, protože může být náročné na CPU. Příklady, jako je import JSON do základních dat, by jinak mohly blokovat kontext zobrazení a vést k nereagování v uživatelském rozhraní.

řešením je využít kontext objektu spravovaného na pozadí. Nejnovější API usnadňují vytvoření nového kontextu z vašeho trvalého kontejneru:

let backgroundContext = persistentContainer.newBackgroundContext()

doporučuji tuto metodu přes inicializátor NSManagedObjectContext(concurrenyType:), protože bude automaticky spojena s NSPersistentStoreCoordinator a bude nastavena na spotřebu NSManagedObjectContextDidSave vysílání. To udržuje kontext pozadí v synchronizaci s kontextem zobrazení.

tento kontext pozadí Můžete uložit do vlastní podtřídy trvalého kontejneru. Tímto způsobem můžete znovu použít kontext pozadí a musíte spravovat pouze dva kontexty. Díky tomu je vaše základní datová struktura snadno srozumitelná a zabraňuje tomu, aby došlo k více synchronizačním kontextům.

Pokud máte pouze k použití na pozadí kontextu, v několika místech, můžete se také rozhodnout použít performBackgroundTask(_:) metoda, která vytváří pozadí, kontext, v místě:

persistentContainer.performBackgroundTask { (backgroundContext) in // .. Core Data Code}

Nicméně, tato metoda vytvoří nový NSManagedObjectContext pokaždé, když je vyvolána. Možná budete chtít zvážit použití sdíleného kontextu na pozadí, pokud odesíláte častěji kontext na pozadí.

Důležité: nedávejte NSManagedObject instance mezi fronty

Psaní multi-threaded Základní Údaje kód je mnohem složitější, než použití jediného pohledu kontextu. Důvodem je to, že nemůžete jednoduše předat NSManagedObject instanci z kontextu pohledu do kontextu pozadí. To by mělo za následek krach a potenciální poškození dat.

Když je nutné přesunout spravované objekt z jedné fronty do jiné můžete využít NSManagedObjectID která je thread-safe:

let managedObject = NSManagedObject(context: persistentContainer.viewContext)backgroundContext.perform { let object = try? backgroundContext.existingObject(with: managedObject.objectID)}

2: Pouze uložit spravované kontext objektu v případě potřeby

Ukládání spravovaného objektu kontextu zavazuje všechny aktuální změny v souvislosti mateřské obchod. Jak si dokážete představit, nejedná se o levnou operaci a měla by být použita pouze v případě potřeby k zajištění výkonu v základních datech.

nejprve je důležité zkontrolovat, zda je vůbec co uložit. Pokud nedojde k žádným změnám odevzdání, není také důvod provést uložení. Vytvořením metody saveIfNeeded si dovolíte snadno zabudovat kontrolu:

pečlivě zvažte, kdy Uložit změny

kromě použití saveIfNeeded místo save() musíte také zvážit, zda má uložení smysl. Ačkoli kontext může mít změny, není vždy nutné tyto změny přímo odevzdat.

pokud máte například do databáze Důležité více položek, můžete uložit pouze po importu všech položek v kontextu pozadí. Po uložení často následují aktualizace uživatelského rozhraní a vícenásobné ukládání po sobě by mohlo snadno vést ke zbytečnému opětovnému načtení. Kromě toho vezměte v úvahu, že uložené změny v kontextu pozadí jsou sloučeny do kontextu zobrazení a brzy také blokují hlavní frontu. Proto buďte při vědomí!

3: Načíst pouze to, co potřebujete

načítání dat je nákladný úkol a musí být co nejvýkonnější, aby byla vaše aplikace připravena pro velké datové sady. Následující kód je často chyba:

Tento kód načte všechny vložené objekty do paměti, dokud je filtrován přímo, poté, co se jen zůstat s obsahem s názvem.

je mnohem výkonnější používat predikáty pouze k načtení potřebných objektů. Výše uvedený filtr může být zapsán následovně NSPredicate:

to má dvě výhody:

  • Pouze potřebné objekty jsou načteny do paměti
  • nemusíte iterovat přes všechny objekty,

Predikáty jsou velmi flexibilní a měl by umožnit, aby přinesla požadované datové sady ve většině případů při zachování výkonu v Core Data.

4: využijte omezení načtení

v návaznosti na předchozí příklad je důležité nastavit limity načtení, pokud chcete zobrazit pouze část datové sady.

například řekněte, že potřebujete pouze první 3 názvy všech položek obsahu. V tomto případě by nebylo nutné načíst všechny položky obsahu, které mají název, do paměti. Mohli bychom tomu zabránit nastavením limitu načtení:

tento kód vrátí pouze první 3 položky obsahu s názvem.

5: Odstranit mnoho objektů najednou pomocí NSBatchDeleteRequest

Místo iterace přes dataset mazání jednotlivých objektů jeden po druhém je často výkonnější použít NSBatchDeleteRequest, který běží rychleji, jak to funguje na úrovni SQL v trvalé obchod sám.

můžete se dozvědět více o dávkových mazacích požadavcích v mém blogu pomocí NSBatchDeleteRequest k odstranění dávek v základních datech.

6: vědět, jak ladit základní datový kód

stejně jako u všech kódů, které píšete, je důležité vědět, jak jej optimalizovat a ladit, jakmile nebude fungovat podle očekávání. Existuje mnoho způsobů ladění, které jsou nejlépe vysvětleny v mém vyhrazeném blogu: ladění základních dat v Xcode pomocí spouštěcích argumentů.

Architektuře SwiftUI aplikace s MVC a MVVMAlthough můžete vytvořit aplikaci, jednoduše tím, že hodí nějaký kód, spolu, bez osvědčených postupů a robustní architekturu, budete brzy skončit s nezvladatelným špagety kód. Naučte se, jak vytvořit solidní a udržovatelné aplikace s menším počtem chyb pomocí tohoto bezplatného průvodce.

závěr

psaní výkonného základního datového kódu od začátku vám pomůže připravit aplikaci pro budoucí velké datové sady. Ačkoli vaše aplikace může být na začátku, může se snadno zpomalit, jakmile vaše databáze a model roste. Využitím kontextu na pozadí, inteligentních požadavků na načtení a požadavků na dávkové odstranění již učiníte svůj základní datový kód výkonnějším.

pokud chcete zlepšit své znalosti Swift, ještě více, podívejte se na stránku Kategorie Swift. Pokud máte nějaké další tipy nebo zpětnou vazbu, neváhejte mě kontaktovat nebo mi napište na Twitter.

díky!



+