Groot ofera un mod simplu de serializare a graficelor obiectelor Core Data din sau in JSON.

Foloseste adnotari in modelul Core Data pentru a efectua serializarea si ofera urmatoarele caracteristici:

  1. Atribut si mapare relatie la caile cheie JSON.
  2. Transformarea valorii folosind obiecte denumite NSValueTransformer.
  3. Conservarea graficului de obiecte.
  4. Suport pentru mostenirea entitatii

Instalarea Groot

Utilizarea CocoaPods

Adaugati urmatoarele la Podfile:

use_frameworks! pod “Groot”

Sau, daca trebuie sa acceptati iOS 6 / OS X 10.8:

Apoi executati $ pod install.

Daca nu aveti instalate sau integrate CocoaPods in proiectul dvs., puteti afla cum sa faceti acest lucru aici.

Folosind Cartagina

Adaugati urmatoarele la fisierul dvs. Cart:

github “gonzalezreal / Groot”

Apoi rulati actualizarea $ carthage.

Urmati instructiunile din README-ul Carthage pentru a adauga cadrul la proiectul dvs.

Este posibil sa trebuiasca sa setati continutul incorporat contine cod Swift la YES in setarile de constructie pentru tintele care contin doar cod Objective-C.

Notiuni de baza

Luati in considerare urmatorul JSON care descrie un cunoscut personaj de benzi desenate:

{“id”: “1699”, “name”: “Batman”, “real_name”: “Bruce Wayne”, “powers”: [{“id”: “4”, “name”: “Agility”}, { “id”: “9”, “name”: “Insanely Rich”}], “publisher”: {“id”: “10”, “name”: “DC Comics”}}

Am putea traduce acest lucru intr-un model de date de baza folosind trei entitati: Caracter, Putere si Publisher.

Cartografierea atributelor si a relatiilor

Groot se bazeaza pe prezenta anumitor perechi cheie-valoare in dictionarul de informatii despre utilizatori asociate cu entitati, atribute si relatii pentru a serializa obiecte gestionate din sau in JSON. Aceste perechi cheie-valoare sunt adesea denumite in documentatie ca adnotari.

In exemplul nostru, ar trebui sa adaugam un JSONKeyPath in dictionarul de informatii despre utilizator al fiecarui atribut si relatie specificand calea cheii corespunzatoare in JSON:

  • id pentru atributul identificator,
  • nume pentru atributul nume,
  • real_name pentru atributul realName,
  • puteri pentru relatia de puteri,
  • editor pentru relatia cu editorul,
  • etc.

Atributele si relatiile care nu au o intrare JSONKeyPath nu sunt luate in considerare pentru serializarea sau deserializarea JSON.

Transformatoare de valoare

Cand am creat modelul, am decis sa folosim Numarul intreg 64 pentru atributele noastre de identificare. Problema este ca, din motive de compatibilitate, JSON foloseste siruri pentru valori id.

Putem adauga o intrare JSONTransformerName in dictionarul cu informatii despre utilizator al fiecarui atribut de identificare, specificand numele unui transformator de valori care converteste sirurile in numere.

Groot ofera o modalitate simpla de creare si inregistrare a transformatoarelor de valoare numite:

// Swift func toString (_ value: Int) -> String? {return String (value)} func toInt (_ value: String) -> Int? {returneaza Int (valoare)} ValueTransformer.

incesto en espanol folladas caseras reales
videos sexo español pajas en español
fakings.tv coños ricos
mujeresfollando incesto lesbianas
folladas extremas brutal tops
sione cooper casadas españolas follando
gorditas tetonas mamadas de polla
porno espania sexo hd
joven folla por dinero porno france
vidiosxxx peliculas eroticas italianas
como folla mi vecina xxxespañol
abuelasputas incestoxxx
padre se folla a su hija follando con mi mujer
vídeos de sexo gratis videos xxx violadas
analxxx peliculas porno castellano
pilladas desnudas españolas masturbandose
pelis porno españolas abuela porno
forzadas a follar muy maduras follando
porno viejas en español fiestas xxx
videos porno para mujeres gratis mi mujer me folla el culo

setValueTransformer (withName: “StringToInteger”, transform: toInt, reverseTransform: toString)

// Obiectiv-C [NSValueTransformer grt_setValueTransformerWithName: @ “StringToInteger” transformBlock: ^ id (NSString * value) {return @ ([value integerValue]); } reverseTransformBlock: ^ id (NSNumber * value) {return [value stringValue]; }];

Conservarea graficului de obiecte

Pentru a pastra graficul obiectelor si a evita duplicarea informatiilor la serializarea obiectelor gestionate din JSON, Groot trebuie sa stie cum sa identifice in mod unic obiectele model.

In exemplul nostru, ar trebui sa adaugam o intrare identityAttributes la dictionarele de utilizator ale entitatilor Character, Power si Publisher cu identificatorul valorii.

Adaugarea adnotarii identityAttributes la entitatile dvs. poate afecta performanta atunci cand se serializeaza din JSON. Pentru mai multe informatii, consultati Performanta unificarii obiectelor.

Pentru mai multe informatii despre adnotarea modelului dvs., consultati Adnotari.

Serializarea din JSON

Acum ca avem modelul nostru Core Data gata, putem incepe sa adaugam cateva date.

// Swift let batmanJSON: JSONDictionary = [“name”: “Batman”, “id”: “1699”, “powers”: [[“id”: “4”, “name”: “Agility”], [” id “:” 9 “,” name “:” Insanely Rich “]],” publisher “: [” id “:” 10 “,” name “:” DC Comics “]] do {let batman: Character = try object (din JSONDictionary: batmanJSON, inContext: context)} catch let error as NSError {// handle error}
// Caracterul Objective-C * batman = [GRTJSONSerialization objectWithEntityName: @ “Character” dinJSONDictionary: batmanJSON inContext: self.context error: & error];

Daca dorim sa actualizam obiectul pe care tocmai l-am creat, Groot poate imbina modificarile pentru noi:

// Swift lasa updateJSON: JSONDictionary = [“id”: “1699”, “real_name”: “Bruce Wayne”,] do {// Aceasta va returna obiectul gestionat creat anterior lasa batman: Character = try object (dinJSONDictionary: updateJSON , inContext: context)} catch let error as NSError {// handle error}

Serializarea relatiilor din identificatori

Sa presupunem ca API-ul nostru nu returneaza obiecte complete pentru relatii, ci doar identificatorii.

Nu este nevoie sa ne schimbam modelul pentru a sustine aceasta situatie:

// Swift let batmanJSON: JSONDictionary = [“name”: “Batman”, “real_name”: “Bruce Wayne”, “id”: “1699”, “powers”: [“4”, “9”], “editor “:” 10 “] do {let batman: Character = try object (fromJSONDictionary: batJJSON, inContext: context)} catch let error as NSError {// handle error}

Codul de mai sus creeaza un obiect caracter complet si relatiile corespunzatoare care indica obiectele Power si Publisher care au doar atributul identificator completat.

Putem importa puteri si editor din diferite obiecte JSON si Groot le va imbina frumos:

// Swift let powersJSON: JSONArray = [[“id”: “4”, “name”: “Agility”], [“id”: “9”, “name”: “Insanely Rich”]] permite editorului JSON: JSONDictionary = [“id”: “10”, “name”: “DC Comics”] do {let _: [Power] = try objects (fromJSONArray: powersJSON, inContext: context) let _: Publisher = try object (fromJSONDictionary: publisherJSON , inContext: context)} catch let error as NSError {// handle error}

Retineti ca relatiile de serializare din identificatori functioneaza numai cu entitati care specifica un singur atribut ca valoare a adnotarii identityAttributes.

Pentru mai multe alternative de serializare verificati Groot.swift si GRTJSONSerialization.h.

Mostenirea entitatii

Groot accepta mostenirea entitatii prin adnotarea entityMapperName.

Daca utilizati SQLite ca magazin persistent, Core Data implementeaza mostenirea entitatii prin crearea unui tabel pentru entitatea parinte si toate entitatile copil, cu un superset al tuturor atributelor lor. Acest lucru poate avea in mod evident consecinte neintentionate asupra performantei daca aveti o multime de date in entitati, asa ca utilizati aceasta caracteristica cu intelepciune.

Performanta unica a obiectelor

Unicizarea obiectelor poate afecta performanta la serializarea din JSON, deoarece necesita preluarea datelor din baza de date inainte de inserare.

Daca aruncati o privire asupra modului in care Groot este implementat, exista trei strategii de serializare:

  • Introduce
  • Unicitate
  • Unic compozit

Dupa cum ati putea ghici, primul este cel mai performant, deoarece nu este preluat din baza de date. Daca stiti ca nu exista date duplicate in setul dvs. de date, NU setati atribute de identitate in entitatea dvs. Acest lucru il va face pe Groot sa utilizeze strategia Insert .

Groot va alege strategia Uniquing daca adnotarea identityAttributes are un singur atribut, altfel va alege strategia Composite Uniquing .

Uniquing strategiei necesita un preluari pentru fiecare matrice de JSON obiecte, in timp ce compozit Uniquing strategiei necesita un preluari pentru fiecare singur obiect JSON (este potential cel mai lent dintre cele trei strategii).

Serializarea catre JSON

Groot ofera metode de serializare a obiectelor gestionate inapoi la JSON:

// Swift let result = json (fromObject: batman)
// Obiectiv-C NSDictionary * JSONDictionary = [GRTJSONSerialization JSONDictionaryFromObject: batman];

Pentru mai multe alternative de serializare verificati Groot.swift si GRTJSONSerialization.h.

a lua legatura

Guillermo Gonzalez

@ gonzalezreal

Licenta

Groot este disponibil sub licenta MIT.