Knihovna Foundation. Seminář ios Martin Hrubý, FIT VUT v Brně



Podobné dokumenty
CloudKit I. (zatím ne zcela dořešené koncepty použití) Martin Hrubý Seminář ios, FIT VUT v Brně

ios Cvičení RSS čtečka

KTE / ZPE Informační technologie

Uživatelské rozhraní v ios. Martin Hrubý FIT VUT v Brně

Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007

RMI Remote Method Invocation

Abstraktní datové typy

UJO Framework. revoluční architektura beans. verze

Úvod do jazyka C. Ing. Jan Fikejz (KST, FEI) Fakulta elektrotechniky a informatiky Katedra softwarových technologií

Jazyk C# a platforma.net

Obsah přednášky 7. Základy programování (IZAPR) Přednáška 7. Parametry metod. Parametry, argumenty. Parametry metod.

ADT/ADS = abstraktní datové typy / struktury

Nástroje na vývoj aplikací pro ios Trocha motivace na úvod Co budete potřebovat Co když nemáte k dispozici počítač s macos? Vývojové prostředí Xcode

Pascal. Katedra aplikované kybernetiky. Ing. Miroslav Vavroušek. Verze 7

Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007

Vytváření a použití knihoven tříd

Úvod do programování - Java. Cvičení č.4

Tabulka symbolů. Vazba (binding) Vazba - příklad. Deklarace a definice. Miroslav Beneš Dušan Kolář

typová konverze typová inference

Platforma.NET 11.NET Framework 11 Visual Basic.NET Základní principy a syntaxe 13

Příklad aplikace Klient/Server s Boss/Worker modelem (informativní)

Operační systémy. Cvičení 4: Programování v C pod Unixem

Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007

Programování v Javě I. Leden 2008

Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007

Obsah. Předmluva 13 Zpětná vazba od čtenářů 14 Zdrojové kódy ke knize 15 Errata 15

George J. Klir. State University of New York (SUNY) Binghamton, New York 13902, USA

Jazyk C# (seminář 5)

Komponenty v.net. Obsah přednášky

PREPROCESOR POKRAČOVÁNÍ

Generické programování

boolean hasnext() Object next() void remove() Kolekce

Obsah přednášky. programovacího jazyka. Motivace. Princip denotační sémantiky Sémantické funkce Výrazy Příkazy Vstup a výstup Kontinuace Program

Úvod do programovacích jazyků (Java)

Knot DNS Resolver. Modulární rekurzivní resolver. Karel Slaný

DSL manuál. Ing. Jan Hranáč. 27. října V této kapitole je stručný průvodce k tvorbě v systému DrdSim a (v

Soubor jako posloupnost bytů

Vývoj SW pro mobilní zařízení s ios. Petr Hruška, Skymia s.r.o. Teorie a praxe IP telefonie,

Reaktivní programování v.net

Šablony, kontejnery a iterátory

Jazyk C# a platforma.net

Statické proměnné a metody. Tomáš Pitner, upravil Marek Šabo

Jazyk C# (seminář 6)

Současné trendy vývoje aplikací pro platformu ios

Seznamy a iterátory. Kolekce obecně. Rozhraní kolekce. Procházení kolekcí

NIO. Aplikační programování v Javě (BI-APJ) - 12 Ing. Jiří Daněček Katedra softwarového inženýrství Fakulta informačních technologií ČVUT Praha

Přednáška 8. Proměnné. Psaní a ladění skriptů. Parametry skriptu. Vstup a výstup. Konfigurační soubory shellu. Úvod do Operačních Systémů Přednáška 8

Základy jazyka C# Obsah přednášky. Architektura.NET Historie Vlastnosti jazyka C# Datové typy Příkazy Prostory jmen Třídy, rozhraní

Základy programování (IZP)

Operační systémy Tomáš Hudec. 6 Komunikace procesů (IPC) Obsah: 6.1 Klasické problémy souběhu Obědvající filosofové

1. Téma 12 - Textové soubory a výjimky

Předmluva k aktuálnímu vydání Úvod k prvnímu vydání z roku Typografické a syntaktické konvence... 20

6. Problém typové anonymity prvků v kolekci Sjednocení typově rozdílných prvků pomocí rozhraní Kolekce pro jeden typ prvků...

Úvod do jazyka C. Ing. Jan Fikejz (KST, FEI) 28. prosince Fakulta elektrotechniky a informatiky Katedra softwarových technologií

Poslední nenulová číslice faktoriálu

Struktura programu v době běhu

Dynamické datové struktury III.

Bázové třídy platformy.net

Základy programování (IZP)

Generování vnitřní reprezentace programu

Univerzita Palackého v Olomouci Radek Janoštík (Univerzita Palackého v Olomouci) Základy programování 4 - C# 19.2.

Software602 Form Designer

1. Téma 03 - Rozhodování

Programování 2 (NMIN102) Soubory. RNDr. Michal Žemlička, Ph.D.

Přednáška 2. Systémy souborů OS UNIX. Nástroje pro práci se souborovým systémem. Úvod do Operačních Systémů Přednáška 2

Množina čísel int stl-set-int.cpp

PŘETĚŽOVÁNÍ OPERÁTORŮ

Šablony, kontejnery a iterátory

Využití OOP v praxi -- Knihovna PHP -- Interval.cz

Obsah. Úvod 11 Základy programování 11 Objektový přístup 11 Procvičování 11 Zvláštní odstavce 12 Zpětná vazba od čtenářů 12 Errata 13

Návrhové vzory. Jakub Klemsa, Jan Legerský. 30. října Objektově orientované programování.

IAJCE Přednáška č. 7. řízení semaforu na křižovatce = přepínání červená/oranžová/zelená

IAJCE Přednáška č. 6. logický celek, řešící dílčí část problému Příklad velmi špatného zápisu programu na výpočet obsahu obdélníku

Class loader. každá třída (java.lang.class) obsahuje referenci na svůj class loader. Implementace class loaderu

SPJA, cvičení 1. ipython, python, skripty. základy syntaxe: základní datové typy, řetězce. podmínky: if-elif-else, vyhodnocení logických výrazů

7. přednáška - třídy, objekty třídy objekty atributy tříd metody tříd

IRAE 07/08 Přednáška č. 7. Začátek (head)

1 - Úvod do platformy.net. IW5 - Programování v.net a C#

Univerzita Palackého v Olomouci Radek Janoštík (Univerzita Palackého v Olomouci) Základy programování 4 - C# 3.4.

Příkazové skripty Procedurální jazyky Lua a ostatní

<surface name="pozadi" file="obrazky/pozadi/pozadi.png"/> ****************************************************************************

Popis funkcí a parametrů programu. Reliance External communicator. Verze 1.5.0

PB přednáška (26. října 2015)

Programování v Javě I. Únor 2009

Abstraktní datové typy: zásobník

Implementace dávkových operací

Cvičení 9 - Monitory. monitor m; var proměnné... procedure p; begin... end; begin inicializace; end;

Java - řazení objektů

Distribuované systémy a výpočty

Webové služby a XML. Obsah přednášky. Co jsou to webové služby. Co jsou to webové služby. Webové služby a XML

NPRG030 Programování I, 2017/18 1 / :22:16

PES lib (C + PASCAL) KNIHOVNY KOMUNIKAÈNÍCH FUNKCÍ 03/ PESlib KOMUNIKAČNÍ KNIHOVNY C, PASCAL 03/ stran 1

Zápis programu v jazyce C#

Pro kontrolu správného formátu hodnoty N použijeme metodu try-catch.

Výjimky. Tomáš Pitner, upravil Marek Šabo

Střední škola pedagogická, hotelnictví a služeb, Litoměříce, příspěvková organizace

9. lekce Úvod do jazyka C 4. část Funkce, rekurze Editace, kompilace, spuštění Miroslav Jílek

Maturitní otázky z předmětu PROGRAMOVÁNÍ

Fronta (Queue) Úvod do programování. Fronta implementace. Fronta implementace pomocí pole 1/4. Fronta implementace pomocí pole 3/4

RMI - Distribuované objekty v Javě

Transkript:

Knihovna Foundation Seminář ios Martin Hrubý, FIT VUT v Brně

Úvod Foundation je nosná páteř všech aplikací v ios a OS X. Je společná pro oba systémy, tzn. jádro vaší aplikace je přenositelné. http://opensource.apple.com/source/cf/ CF-855.17/

Zajímavé části Kolekce - NSArray, NSSet, NSDictionary, + NSPredicate, NSSortDescriptor NSCoding, NSKeyValueCoding protokol, NSData NSCalendar, NSDate NSFileManager (a dokumenty), NSUserDefaults NSOperation, NSTimer, NSRunLoop, NSNotif NSURLSession a další

Kolekce Non-mutable (bez Mutable v názvu) pouze pro čtení. Pokud není důvod mít mutable verzi, vždy provést konverzi. Mutable lze zapisovat. Typické použití: dočasné vytvoření pole v nějakém cyklu. NSArrayController obdoba NSFetchedResultsController pro OS X. jinde atribut NSMutableArray sotva najdete.

NSArray Vytvoření: z pole: [NSArray arraywitharray: pole], konstanta v programu @[obj1, obj2, ], z množiny [aset allobjects], pořadí prvků. operací nad polem. [anarray count], anarray.count [anarray objectatindex: ] dnes již anarray[idx]. Pozor na rozsah (Exception)!

Proxy nad kolekcí @interface Zakaznik : NSObject @property (readonly, nonatomic, strong) NSArray *ucty; @end @implementation Zakaznik -(NSArray *) ucty { return [self mutablearrayvalueforkey: @ pucty ]; -(NSUInteger) countofpucty { return ; -(id) objectinpuctyatindex:(nsuinteger)index { return ; @end Zakaznik *zak = [[Zakaznik alloc] init]; NSLog@( Ucet %@, zak.ucty[12312848481]);

NSSet Vytvoření: z pole: [NSSet setwitharray: ], z mutable: [NSSet setwithset: ], operací nad množinou. [aset anyobject] není random! [aset containsobject: ] rychlejší prohledávání (naděje) než u NSArray (metodu má taky)

Set, random object @interface NSSet (randomobj) -(id) randomobject; @end @implementation NSSet(randomObj) -(id) randomobject { if (self.count == 0) return nil; return [[self allobjects] objectatindex: arc4random_uniform(self.count)]; @end

NSPredicate Základní operací nad kolekcí je enumerace. Definice: řetězcem očekává se key-value. blokem nelze pro Core Data dotazy. instance NSPredicate se použije: filtrování kolekce filteredarray NSFetchRequest NSCompoundPredicate

NSPredicate demo NSArray *zakaznici; NSPredicate *zakmladi = [NSPredicate predicatewithformat: @"vek < 50"]; NSPredicate *zakaznikpepa = [NSPredicate predicatewithformat: @ jmeno=%@" argumentarray:@[@"pepa"]]; NSArray *mladi = [zakaznici filteredarrayusingpredicate: zakmladi]; NSArray *pepa = [zakaznici filteredarrayusingpredicate: zakaznikpepa]; // Core Data NSFetchRequest *req = [[NSFetchRequest alloc] initwithentityname: @"Zakaznik"]; req.predicate = zakmladi;

Enumerace kolekce Kolekce jsou heterogenní for (id i in kolekce) ; for (NSString *jmeno in kolekce) ; Metaúroveň objektů: [object class], nelze vždy porovnávat [@ string class] [object iskindofclass: ]

Enumerace, objc.io // First variant, using `indexesofobjectswithoptions:passingtest:`. NSIndexSet *indexes = [randomarray indexesofobjectswithoptions:nsenumerationconcurrent passingtest:^bool(id obj, NSUInteger idx, BOOL *stop) { return testobj(obj); ]; NSArray *filteredarray = [randomarray objectsatindexes:indexes]; // Filtering using predicates (block-based or text) NSArray *filteredarray2 = [randomarray filteredarrayusingpredicate:[nspredicate predicatewithblock:^bool(id obj, NSDictionary *bindings) { return testobj(obj); ]]; // Block-based enumeration NSMutableArray *mutablearray = [NSMutableArray array]; [randomarray enumerateobjectsusingblock:^(id obj, NSUInteger idx, BOOL *stop) { if (testobj(obj)) { [mutablearray addobject:obj]; ];

Enumerace, objc.io // Classic enumeration NSMutableArray *mutablearray = [NSMutableArray array]; for (id obj in randomarray) { if (testobj(obj)) { [mutablearray addobject:obj]; // Using NSEnumerator, old school. NSMutableArray *mutablearray = [NSMutableArray array]; NSEnumerator *enumerator = [randomarray objectenumerator]; id obj = nil; while ((obj = [enumerator nextobject])!= nil) { if (testobj(obj)) { [mutablearray addobject:obj]; // Using objectatindex: (via subscripting) NSMutableArray *mutablearray = [NSMutableArray array]; for (NSUInteger idx = 0; idx < randomarray.count; idx++) { id obj = randomarray[idx]; if (testobj(obj)) { [mutablearray addobject:obj];

Enumerace, objc.io

Sorting NSSortDescriptor (ascending: (BOOL)) definice jménem klíče (key-value protocol) blokem názvem metody (SEL) Datový typ SEL - název metody @selector(cosi:kdesi:jaksi:) typické pro zadávání metody pro obsluhu události (např. tlačítko UIBarButtonItem)

Sorting Demo NSSortDescriptor *veksd = [NSSortDescriptor sortdescriptorwithkey: @"vek" ascending:yes]; NSArray *podleveku = [zakaznici sortedarrayusingdescriptors: @[veksd]]; NSArray *podlevekublock = [zakaznici sortedarrayusingcomparator: ^NSComparisonResult(Zakaznik *obj1, Zakaznik *obj2) { return [obj1.vek compare: obj2.vek]; ]; // lze na mutable verzi NSMutableArray *zakmutable = [NSMutableArray arraywitharray: zakaznici]; [zakmutable sortusingdescriptors: @[veksd]]; // Core Data // pro NSFetchedResultsController povinne // musi byt definovano sorting NSFetchRequest *req; req.sortdescriptors = @[veksd];

NSCalendar Nikdy nezkoušejte vlastní kalendářové výpočty [NSDate date], NSTimePeriod klasická absolutní informace o počtu sekund od počátku cal. [NSDate datewithtimeintervalsince1970:] NSDateFormatter, NSDateComponents NSCalendar pozor, není thread-safe

Calendar, demo NSDate *now = [NSDate date]; NSDate *nowplus = [now datebyaddingtimeinterval: 60*10]; NSTimeInterval diff = [nowplus timeintervalsincedate: now]; NSCalendar *calendar = [NSCalendar currentcalendar]; NSDateComponents *comps = [calendar components: NSYearCalendarUnit NSMonthCalendarUnit fromdate: now]; NSDateComponents *addc = [[NSDateComponents alloc] init]; addc.month = 1; NSDate *nextmonth = [calendar datebyaddingcomponents: addc todate: now options:0]; NSDateFormatter *form = [[NSDateFormatter alloc] init]; [form settimestyle: NSDateFormatterMediumStyle]; [form setdatestyle: NSDateFormatterShortStyle]; NSString *outp = [form stringfromdate: now]; NSLog(@"Date: %@", outp); // Date: 14.10.14 13:54:19

NSFileManager Operace nad soubory. App sandbox. vytvoření, smazání, přesun, Soubor vždy identifikován NSURL, url.path Základní přístup k souborům. Dokumenty. Dokumenty: Sandbox Documents. Ubiquitous icloud icloud Drive

NSFileManager // z app bundle. CoreData DB Model. NSURL *modelurl = [[NSBundle mainbundle] URLForResource:@"TableViewCD" withextension:@ momd"]; -(NSURL *) applicationdocumentsdirectory { NSFileManager *fm = [NSFileManager defaultmanager]; NSArray *dirs = [fm URLsForDirectory: NSDocumentDirectory indomains: NSUserDomainMask]; return [dirs lastobject]; // CoreData Sqlite3 store NSURL *storeurl = [[self applicationdocumentsdirectory] URLByAppendingPathComponent:@ TableViewCD.sqlite"];

Soubory low-level + UIDocument NSFileManager *fm = [NSFileManager defaultmanager]; // Obsah souboru NSURL *soubor = [[self applicationdocumentsdirectory] URLByAppendingPathComponent: @"soubor"]; NSData *cont = [fm contentsatpath: soubor.path]; NSString *contstring = [NSString stringwithutf8string: cont.bytes]; NSScanner *scanner = [NSScanner scannerwithstring: contstring]; int cislo; [scanner scanint: &cislo]; // format dokumentu v doc-based app UIDocument *doc; [doc savetourl: soubor forsaveoperation: UIDocumentSaveForCreating completionhandler:^(bool success) { NSLog(@"Soubor zapsan: %d", (int) success); ];

icloud Ubiquitous Document NSURL *icloudurl = [fm URLForUbiquityContainerIdentifier: @"icloud.eu.cosi.clouddoc"]; NSURL *iclouddoc = [icloudurl URLByAppendingPathComponent: @"Documents" isdirectory:yes]; NSURL *tosaveurl = [iclouddoc URLByAppendingPathComponent: @"nazev"]; CDDocument *doc = [[CDDocument alloc] initwithfileurl: tosaveurl]; [doc savetourl: tosaveurl forsaveoperation:uidocumentsaveforcreating completionhandler:^(bool success) { if (success) NSLog(@"Document saved"); else NSLog(@"Error saving the document"); ];

icloud Drive Picker pro soubor. Umožněno pouze import/ export. Není home adresář. Ukazka pickeru. Vybraný soubor pro import se klonuje do tmp sandboxu aplikace.

iclouddrive, PDF Reader -(void) buttonopen:(id)sender { UIDocumentPickerViewController *vc = [[UIDocumentPickerViewController alloc] initwithdocumenttypes: @[@"public.composite-content", @"com.adobe.pdf"] inmode: UIDocumentPickerModeImport]; vc.delegate = self; vc.modalpresentationstyle = UIModalPresentationFormSheet; [self presentviewcontroller: vc animated: YES completion:^{ ]; -(void) documentpicker:(uidocumentpickerviewcontroller *)controller didpickdocumentaturl:(nsurl *)url { NSLog(@"URL: %@", url); self.pdf = CGPDFDocumentCreateWithURL(( bridge CFURLRef) url);

NSUserDefaults Perzistentní dictionary pro aplikaci. Metody pro set/get typu int, bool, string, array. Argumenty příkazové řádky. Register defaults. Synchronize. NSUD mají i extensions (ios 8) typicky od hostitelske aplikace. App Settings Bundle.

NSUserDefaults NSUserDefaults *UD = [NSUserDefaults standarduserdefaults]; NSURL *facdefs = [[NSBundle mainbundle] URLForResource:@"DefaultPreferences" withextension:@ plist"]; NSDictionary *defaultprefs = [NSDictionary dictionarywithcontentsofurl: facdefs]; // reg. defaults neni perzistentni! // volat vzdy pri app:didfinishlaunchingwithoptions: [UD registerdefaults:defaultprefs]; BOOL firstrun = [UD boolforkey: @"firstrun"]; [UD setbool: NO forkey: @"firstrun"]; [UD synchronize]; if (firstrun) { // Vitaci obrazovka // Today App Extension (ios 8) NSUserDefaults *UDExt = [[NSUserDefaults alloc] initwithsuitename: @"com.cosi.app"];

NSTimer Alokace timeru a registrace v run loop. Deaktivovat timery při přechodu do background módu.

NSTimer demo // objekt je referencovan v NSRunLoop NSTimer *ts = [NSTimer scheduledtimerwithtimeinterval: 1 target: self selector: @selector(mtimer:) userinfo: nil repeats: YES]; // zruseni. Pak znovu alokace. [ts invalidate]; // odlozeny call [self performselector: @selector(stalose:) withobject: nil afterdelay: 10]; NSDate *datefire; NSTimer *timerat = [[NSTimer alloc] initwithfiredate: datefire interval: 0 target: self selector:@selector(mtimer:) userinfo: nil repeats:no]; // registrace NSRunLoop *runner = [NSRunLoop currentrunloop]; [runner addtimer:timerat formode: NSDefaultRunLoopMode];

NSOperation a queue Předchůdce GCD. Dnes je implementováno pomocí GCD. Je to kód, ktery se zaradi do fronty. Má vlastní data. Lze znovu-použít. Nelze killnout vlákno nebo operaci. Lze jim poslat zprávu. CloudKit operace s CK jsou všechny NSOp.

NSOperation demo @interface MojeOperace : NSOperation -(void) main; @end @implementation MojeOperace -(void) main { while ([self worktodo]) { [self dosomework]; @end if ([self.iscancelled]) break; NSOperationQueue *mq = [NSOperationQueue mainqueue]; MojeOperace *operace = [[MojeOperace alloc] init]; // nastav data operaci [mq addoperation: operace];

Komunikace v aplikaci Objekty si zasílají zprávy (pokud se znají). Delegate. Protocol. Objekt má jednoho delegáta. Implementace a meta protokol. Nilu lze poslat lib. zprávu, ale objektu nelze poslat lib zprávu. NSNotificationCenter Pozor na typ vlákna, které kód provádí!

Delegate demo // komunikacni protokol @protocol Komunikace <NSObject> -(void) objekt: (id) jaobject dokoncilpraci: (NSArray *) vysledek; @optional -(void) objektstalezije:(id)jaobject; @end // jedna strana @interface Pracujici : NSObject @property (nonatomic, strong) id<komunikace> delegate; @end @implementation Pracujici -(void) hokna { // NSArray *vysledky; [self.delegate objekt: self dokoncilpraci: vysledky]; if ([self.delegate respondstoselector: @selector(objektstalezije:)]) [self.delegate objektstalezije: self]; @end

Delegate demo @interface Konzumujici : NSObject<Komunikace> @end @implementation Konzumujici -(void) objekt:(id)jaobject dokoncilpraci:(nsarray *)vysledek { @end

NSNotificationCenter Singleton. Velmi rozsáhlé sys zprávy. Registruje observery událostí. Srovnání s delegates. Výhodné pro události, kde je dynamický počet observerů. Při poslání zprávy do centra se okamžitě rozesílá do observerů, tj ve stejném vlákně. Pozor při operacích s UI.

Notifikace demo #define MOJEZPRAVA @"tohle-je-nazev" -(void) obsluhanotif: (NSNotification *) notif { -(void) dealloc { NSNotificationCenter *nc = [NSNotificationCenter defaultcenter]; [nc removeobserver: self]; -(void) viewdidload { [super viewdidload]; NSNotificationCenter *nc = [NSNotificationCenter defaultcenter]; // registrace observeru [nc addobserver: self selector: @selector(obsluhanotif:) name: MOJEZPRAVA object: nil]; // poslani zpravy NSNotification *notif = [NSNotification notificationwithname: MOJEZPRAVA object: nil]; [nc postnotification: notif]; [nc postnotificationname: MOJEZPRAVA object: nil];