Dezvoltat si intretinut de ipodishima Founder & CTO la Wasappli Inc.

Sponsorizat de Wisembly

Un cartograf rapid de la JSON la NSObject

  • Rapid
  • Simplu de scris si citit
  • Va economiseste multe ore
  • Suporta ambele JSON <-> NSObject
  • Proiectat pentru personalizare
  • Magazin CoreData, NSCoding si Memorie incorporat
  • Obiect de inserare sau actualizare incorporat
  • Testat

Accesati wiki pentru mai multe detalii despre utilizarea avansata WAMapping.

WAMapping este o biblioteca pentru iOS care transforma dictionarele in obiecte si obiectele in dictionar. Scopul sau este de a simplifica boilerplat de analiza manuala a datelor si de atribuire a valorilor unui obiect. Este si mai dificil atunci cand vine vorba de utilizarea acestuia cu CoreData din cauza inserarii sau actualizarii. Si nu mentionez spectacole implicate. WAMapping rezolva acest lucru pentru dvs.!

Instalati si utilizati

Cocoapode

Utilizati Cocoapods, acesta este cel mai simplu mod de a instala mapperul.

pod „WAMapping”

#import <WAMapping / WAMapping.h>

Configurarea maparii

La o utilizare clasica, sursa este cunoscuta ca raspunsul de la un server transformat intr-un dictionar, iar destinatia este obiectul destinatie pentru a aplica valorile, de exemplu un NSManagedObject.

Sa presupunem clasa Enterprise dupa cum urmeaza:

@interface Enterprise: NSObject @property (nonatomic, puternic) NSNumber * itemID; @property (nonatomic, puternic) NSString * nume; @property (nonatomic, puternic) NSDate * creationDate; @property (nonatomic, puternic) Numar NS * Numar strada; @property (nonatomic, puternic) angajati NSArray *; // Poate fi modificabil, sau un „NSSet” sau un „NSOrderedSet“ @property (nonatomic, puternic) sefii NSArray *; @Sfarsit

ID-ul articolului identifica obiectul dvs. din magazin. Acest lucru nu este necesar, dar este recomandat pentru a evita crearea de duplicate.

Presupunand un json

{“id”: 1, “name”: “Wasappli”, “creation_date”: “2013-10-01”, “address”: {“street_number”: 5149}}

Cartarea ar arata ca.

WAEntityMapping * enterpriseMapping = [WAEntityMapping mappingForEntityName: @ “Enterprise”]; enterpriseMapping.identificationAttribute = @ “itemID”; // Adaugati atributele clasice [enterpriseMapping addAttributeMappingsFromDictionary: @ {@ “id”: @ “itemID”, @ “name”: @ “name”, @ “address.street_number”: @ “streetNumber”}]; // Hartati valorile personalizate. Aici un `NSDate` dintr-un sir folosind un„ NSDateTransformer` [enterpriseMapping addMappingFromSourceProperty: @ “creation_date” toDestinationProperty: @ “creationDate” withBlock: ^ id (valoare id) {return [dateFormatter dateFromString: value]; } reverseBlock: ^ id (valoare id) {return [dateFormatter stringFromDate: value]; }]; // Inregistrati maparea pentru utilizare viitoare WAMappingRegistrar * registrar = [WAMAppingRegistrar new]; [registrar registerMapping: enterpriseMapping]; // [registrar registerMapping: angajatMapping]; // WAEntityMapping * savedEnterpriseMapping = [registrator mappingForEntityName: @ “Enterprise”];

Si asta e..

porno fuerte mamadas en la playa
peliculas x vintage sexporno
corridas brutales en la boca michelle jenner desnuda
alexa grace folladoras
porno xxxxx coños maduros
porno obligado filme porno romanesti
cinema gropers pornoo
jovencitas peludas follando chupadas
carne de mercado xxx chochitos jovenes
madres xxxx maduras tragando semen
travestis españolas sexo español gratis
putas vic peludas españolas
se folla a su compañero de piso pajas en la playa
desvirga a su hermana comiendo coño
videos guarros mujeres follando gratis
shakira follando moras follando
maduras comiendose el coño porno del bueno
descargar pelis pornos incesto subtitulado
tias cachondas videosgay
travestis jovencitas yola berrocal follando

.!

Folositi cartograf

Mai intai, creati un magazin. Acesta este un pas obligatoriu. Furnizez trei magazine pentru aceasta repo:

  • WAMemoryStore care se bazeaza pe un NSMutableSet simplu,
  • WANSCodingStore care va salveaza obiectele folosind protocolul NSCoding,
  • WACoreDataStore care foloseste CoreData.

Va puteti crea cu usurinta propriul magazin daca doriti sa utilizati SQLite, de exemplu, mergeti la wiki.

WAMemoryStore * store = [[WAMemoryStore alloc] init]; // sau // WACoreDataStore * store = [[WACoreDataStore alloc] initWithManagedObjectContext: localContext]; // sau // WANSCodingStore * store = [[WANSCodingStore alloc] initWithArchivePath: archivePath];

Apoi, alocati un cartograf cu magazinul

WAMapper * mapper = [[WAMapper alloc] initWithStore: store];

In cele din urma, mapati reprezentarea dictionarului la obiect:

[mapper mapFromRepresentation: json mapping: enterpriseMapping complete: ^ (NSArray * mappedObjects) {firstEnterprise = [mappedObjects firstObject]; }];

Si voila!

Adaugati nave de relatie

WAMapping accepta, de asemenea, relatiile:

  • clasice:
{“id”: 1, “first_name”: “Marian”, “enterprise”: {“id”: 1, “name”: “Wasappli”, “creation_date”: “2013-10-01”, “address”: {“street_number”: 5149}}}
WARelationshipMapping * enterpriseRelationship = [WARelationshipMapping relationMappingFromSourceProperty: @ “enterprise” toDestinationProperty: @ “enterprise” withMapping: enterpriseMapping]; [employeeMapping addRelationshipMapping: enterpriseRelationship];
  • Numai cu atribut de identificare
{“enterprise”: {“id”: 1, “name”: “Wasappli”, “creation_date”: “2013-10-01”, “address”: {“street_number”: 5149}, “chiefs”: 1 # Ar putea fi, de asemenea, [1, 2, 3]}, “angajati”: [{“id”: 1, “first_name”: “Marian”}]}
WARelationshipMapping * chiefsRelationship = [WARelationshipMapping relationMappingFromSourceIdentificationAttribute: @ “chiefs” toDestinationProperty: @ “chiefs” withMapping: employeeMapping]; [enterpriseMapping addRelationshipMapping: chiefsRelationship];

Cartograf invers

Un cartograf invers este, de asemenea, ambalat cu aceasta biblioteca. Accepta transformarea inversa de la un obiect la un dictionar.

WAReverseMapper * reverseMapper = [[WAReverseMapper alloc] init]; json = [reverseMapper reverseMapObjects: enterprise fromMapping: enterpriseMapping shouldMapRelationship: nil];

Daca aveti un server care returneaza toate datele in acelasi format, atunci puteti solicita o data cartografului sau cartografului invers sa transforme valoarea.

In loc sa scrie

[enterpriseMapping addAttributeMappingsFromDictionary: @ {@ “id”: @ “itemID”, @ “name”: @ “name”, @ “address.street_number”: @ “streetNumber”}]; // Harta valorilor personalizate. Aici un `NSDate` dintr-un sir folosind un„ NSDateTransformer` [enterpriseMapping addMappingFromSourceProperty: @ “creation_date” toDestinationProperty: @ “creationDate” withBlock: ^ id (valoare id) {return [dateFormatter dateFromString: value]; } reverseBlock: ^ id (valoare id) {return [dateFormatter stringFromDate: value]; }];

Ai scrie

[enterpriseMapping addAttributeMappingsFromDictionary: @ {@ “id”: @ “itemID”, @ “name”: @ “name”, @ “address.street_number”: @ “streetNumber”, @ “creation_date”: @ “creationDate”}]; id (^ toDateMappingBlock) (id) = ^ id (valoare id) {if ([value isKindOfClass: [NSString class]]) {return [dateFormatter dateFromString: value]; } valoare returnata; }; [mapper addDefaultMappingBlock: toDateMappingBlock forDestinationClass: [NSDate class]];

Acelasi lucru se intampla si cu cartograful invers. Retineti ca, daca furnizati o mapare personalizata pe un obiect NSDate pentru o anumita proprietate (cum ar fi o data cu doar anul), puteti adauga proprietatea la maparea entitatii, care va inlocui comportamentul implicit pentru aceasta proprietate specifica.

Atat WAMapper, cat si WAReverseMapper accepta NSProgress. Retineti ca Apple spune in mod explicit in documentatia lor despre NSProgressReporting (pe care il imitam aici) Obiectele care adopta acest protocol ar trebui sa fie de obicei „one-shot”, ceea ce inseamna ca ar trebui sa utilizati un WAMapper pentru fiecare operatie de harta.

Progres

Puteti urmari progresul folosind aceasta mica bucata de cod. Retineti ca progresul conteaza principalele obiecte de top mapate (daca matricea dvs. contine un obiect cu o mie de obiecte ca relatie, progresul nu va reflecta miile de subobiecte mapate). Acest lucru este pe alegere, deoarece adoptarea progresului copilului inainte de iOS 9 nu este grozava.

[mapper.progress addObserver: self forKeyPath: NSStringFromSelector (@selector (fractionCompleted)) optiuni: NSKeyValueObservingOptionNew context: NULL];
– (void) observeValueForKeyPath: (NSString *) keyPath ofObject: (id) object change: (NSDictionary <NSString *, id> *) change context: (void *) context {if ([keyPath isEqualToString: NSStringFromSelector (@selector (fractionCompleted) ))] && [object isKindOfClass: [NSProgress class]]) {NSLog (@ “Mapping progress =% f”, [change [@ “new”] doubleValue]); } else {[super observeValueForKeyPath: keyPath ofObject: object change: change context: context]; }}

Anulare

Puteti anula maparea sau maparea inversa folosind aceasta bucata de cod. Retineti ca pentru anulare, trebuie sa apelati maparea dintr-un alt fir!

dispatch_async (dispatch_get_global_queue (DISPATCH_QUEUE_PRIORITY_LOW, 0), ^ {[mapper mapFromRepresentation: mapare JSON: angajat Completarea maparii: ^ (NSArray * mappedObjects, NSError * error) {NSLog (@ “Objects maped, map%) ;}];}); [mapper.progress anuleaza];

TODO

  • Benchmark impotriva cartografilor populari
  • Adaugati mai multe teste pentru gestionarea traseului cheie, in special in relatie

Inspiratie

Veti gasi inspiratie din Restkit si FastEasyMapping. Acestea sunt ambele biblioteci pe care le-am folosit in proiecte, dar cu probleme

#Contributie: probleme, sugestii, cereri de extragere?

Va rugam sa deschideti o noua problema aici daca intampinati o problema specifica WAAppRouting.

Pentru noile caracteristici, solicitarile de tragere sunt incurajate si foarte apreciate! Va rugam sa incercati sa pastrati coerenta cu stilul de cod existent. Daca aveti in vedere sa preluati modificari sau adaugiri semnificative la proiect, va rugam sa ma intrebati inainte deschizand o noua problema pentru a avea sansa unei fuziuni.

# Asta e tot oameni buni!

  • Daca sunteti fericiti, nu ezitati sa-mi trimiteti un tweet @ipodishima!
  • Distribuit sub licenta MIT.
  • Urmariti Wasappli pe facebook