{"id":3673,"date":"2010-06-16T11:57:01","date_gmt":"2010-06-16T09:57:01","guid":{"rendered":"http:\/\/www.devapp.it\/wordpress\/?p=3673"},"modified":"2010-06-22T10:05:33","modified_gmt":"2010-06-22T08:05:33","slug":"t052-creiamo-un-client-twitter-per-iphone-parte-3","status":"publish","type":"post","link":"https:\/\/www.devapp.it\/wordpress\/t052-creiamo-un-client-twitter-per-iphone-parte-3\/","title":{"rendered":"T#052 &#8211; Creiamo un client Twitter per iPhone (Parte 3)"},"content":{"rendered":"<p><a href=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/06\/logo-Twitter-200x200.png\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/06\/logo-Twitter-200x200.png\" alt=\"Logo Twitter\" title=\"logo-Twitter-200x200\" width=\"100\" height=\"100\" class=\"alignleft size-full wp-image-3601\" srcset=\"https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/06\/logo-Twitter-200x200.png 200w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/06\/logo-Twitter-200x200-150x150.png 150w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/06\/logo-Twitter-200x200-64x64.png 64w\" sizes=\"auto, (max-width: 100px) 100vw, 100px\" \/><\/a> Eccoci giunti con l&#8217;ultimo appuntamento dei nostri tutorial dedicati alla realizzazione di un semplice client per Twitter. Vi ricordo che trovate <a href=\"http:\/\/www.devapp.it\/wordpress\/t049-creiamo-un-client-twitter-per-iphone-parte-1.html\" target=\"_blank\">qui la prima parte<\/a>, metre <a href=\"http:\/\/www.devapp.it\/wordpress\/t050-creiamo-un-client-twitter-per-iphone-parte-2.html\" target=\"_blank\">qui la seconda<\/a>.<\/p>\n<p>In questa terza (ed ultima) parte vedremo come utilizzare la classe <strong>NSUserDefault<\/strong>, che ci permetter\u00e0 di salvare delle informazioni relative alla nostra applicazione. Quello che andremo a salvare sar\u00e0 la data in cui \u00e8 stato eseguito l&#8217;ultimo refresh, che mostreremo all&#8217;avvio all&#8217;utente.<!--more--><\/p>\n<p>Ovviamente questa \u00e8 una semplificazione, in applicazioni pi\u00f9 complesse potremmo avere molte pi\u00f9 informazioni da memorizzare (ad esempio dei settaggi come l&#8217;autorefresh, il nome utente o la password).<\/p>\n<p>Prenderemo quindi in esame solo il salvataggio di un parametro, ma vedrete che non sar\u00e0 nulla di difficile!<\/p>\n<h4>1. Inseriamo la label per mostrare la data<\/h4>\n<p>La prima cosa da fare \u00e8 inserire una label in cui venga visualizzata l&#8217;ultima data in cui \u00e8 stato eseguito un refresh della nostra timeline.<\/p>\n<p>Nel file &#8220;SampleTwitterClientViewController.h&#8221; inseriamo la seguente dichiarazione (righe 12 e 24):<\/p>\n<pre lang=\"objc\" line=\"1\" escaped=\"true\">\r\n#import <UIKit\/UIKit.h>\r\n#import \"MGTwitterEngine.h\"\r\n \r\n@class Tweet;\r\n@class TabellaTwitterViewController;\r\n \r\n@interface SampleTwitterClientViewController : UIViewController &lt;MGTwitterEngineDelegate&gt; {\r\n MGTwitterEngine *twitterEngine;\r\n NSMutableArray *listaTweet;\r\n \r\n IBOutlet UIActivityIndicatorView *spinner;\r\n IBOutlet UILabel *labelUltimoRefresh;\r\n \r\n TabellaTwitterViewController *tabellaTwitterViewController;\r\n}\r\n \r\n-(NSString*)getMessaggio:(NSDictionary*)element;\r\n-(NSString*)getUser:(NSDictionary*)element;\r\n-(NSURL*)getUrlImage:(NSDictionary*)element;\r\n \r\n@property (nonatomic, retain) NSMutableArray *listaTweet;\r\n@property (nonatomic, retain) IBOutlet UIActivityIndicatorView *spinner;\r\n@property (nonatomic, retain) IBOutlet TabellaTwitterViewController *tabellaTwitterViewController;\r\n@property (nonatomic, retain) IBOutlet UILabel *labelUltimoRefresh;\r\n \r\n@end\r\n<\/pre>\n<p>Salviamo il file e apriamo &#8220;SampleTwitterClientViewController.xib&#8221;, che aprir\u00e0 IB. Inseriamo una o due label (a vostro piacere), io ho fatto cos\u00ec:<\/p>\n<p><center><br \/>\n<a href=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/06\/creare-client-twitter-iPhone-parte-3-01.png\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/06\/creare-client-twitter-iPhone-parte-3-01.png\" alt=\"Creare un client twitter per iPhone (parte 3) - 01\" title=\"creare-client-twitter-iPhone-parte-3-01\" width=\"400\" height=\"582\" class=\"aligncenter size-full wp-image-3674\" srcset=\"https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/06\/creare-client-twitter-iPhone-parte-3-01.png 400w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/06\/creare-client-twitter-iPhone-parte-3-01-206x300.png 206w\" sizes=\"auto, (max-width: 400px) 100vw, 400px\" \/><\/a><br \/>\n<\/center><\/p>\n<p>La seconda label (quella che contiene il testo &#8220;Label&#8221;) sar\u00e0 quella che visualizzer\u00e0 la data dell&#8217;ultimo refresh della timeline. Selezioniamo ora &#8220;File&#8217;s Owner&#8221; e colleghiamo l&#8217;elemento &#8220;labelUltimoRefresh&#8221;, che abbiamo appena definito, con la label in questione. Se avete eseguito il collegamento in maniera corretta avrete il seguente risultato:<\/p>\n<p><center><br \/>\n<a href=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/06\/creare-client-twitter-iPhone-parte-3-02.png\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/06\/creare-client-twitter-iPhone-parte-3-02.png\" alt=\"Creare un client twitter per iPhone (parte 3) - 02\" title=\"creare-client-twitter-iPhone-parte-3-02\" width=\"301\" height=\"214\" class=\"aligncenter size-full wp-image-3675\" srcset=\"https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/06\/creare-client-twitter-iPhone-parte-3-02.png 301w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/06\/creare-client-twitter-iPhone-parte-3-02-300x213.png 300w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/06\/creare-client-twitter-iPhone-parte-3-02-150x106.png 150w\" sizes=\"auto, (max-width: 301px) 100vw, 301px\" \/><\/a><br \/>\n<\/center><\/p>\n<p>Abbiamo cos\u00ec completato questo primo step. Possiamo salvare tutto e chiudere Interface Builder.<\/p>\n<h4>2. Gestiamo il caricamento\/salvataggio dei dati<\/h4>\n<p>Ora possiamo occuparci del codice che ci interessa, che andr\u00e0 inserito nel file &#8220;SimpleTwitterClientViewController.m&#8221;.<\/p>\n<p>Prima di fare qualsiasi cosa, ricordiamoci di importare la property definita in precedenza, tramite la seguente istruzione (dovete solo aggiungere &#8220;labelUltimoRefresh&#8221;, le altre le avete gi\u00e0 definite):<\/p>\n<pre lang=\"objc\" line=\"1\" escaped=\"true\">\r\n@synthesize listaTweet, spinner, tabellaTwitterViewController, labelUltimoRefresh;\r\n<\/pre>\n<p>Possiamo passare alla parte pi\u00f9 importante. Vediamo, quindi, come salvare i valori che ci interessano. Come abbiamo gi\u00e0 detto, dobbiamo salvare la data dell&#8217;ultimo refresh che l&#8217;applicazione ha eseguito.<\/p>\n<p>Il punto migliore per eseguire il salvataggio \u00e8 dopo la creazione della lista con i vari tweet, che avviene nel metodo &#8220;statusesReceived: forRequest:&#8221;. Ecco, quindi, il codice da inserire in tale metodo:<\/p>\n<pre lang=\"objc\" line=\"1\" escaped=\"true\">\r\n[spinner stopAnimating];\r\n \r\nNSData *dataCorrente = [NSDate date];\r\nNSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];\r\n[defaults setObject:dataCorrente forKey:@\"data\"];\r\n[defaults synchronize];\r\n \r\n[self presentModalViewController:self.tabellaTwitterViewController animated:YES];\r\n<\/pre>\n<p>Le istruzioni alle righe 1 e 8 le troviamo gi\u00e0 (le abbiamo inserite nei precedenti tutorial), dobbiamo quindi inserire solo le restanti. Alla riga 3 abbiamo istanziato un elemento di tipo <strong>NSDate<\/strong>, richiamando poi il metodo &#8220;date&#8221;, che ci restituisce la data e l&#8217;ora corrente. Abbiamo ottenuto, quindi, la data dell&#8217;ultimo refresh.<br \/>\nAlla riga 4 e 5 eseguiamo il salvataggio vero e proprio: prima viene istanziato un oggetto di tipo <em>NSUserDefault<\/em>, poi si salvano al suo interno i valori desiderati. Ci sono vari metodi che devono essere utilizzati per salvare le variabili, a seconda del loro tipo. Nel nostro caso abbiamo utilizzato &#8220;setObject&#8221;, in quanto <em>NSDate<\/em> \u00e8 un oggetto generico. Eccovi altri esempi di metodo per il salvataggio di variabili:<\/p>\n<ul>\n<li>[defaults setInteger:5 forKey:@&#8221;numeroIntero&#8221;];<\/li>\n<li>[defaults setBool:YES forKey:@&#8221;valoreBooleano&#8221;];<\/li>\n<li>[defaults setFloat:0.24 forKey:@&#8221;numeroFloat&#8221;];<\/li>\n<\/ul>\n<p>Come potete notare ci sono vari metodi, a seconda del tipo di variabile. Li trovate tutti, comunque, nella documentazione.<\/p>\n<p>L&#8217;ultima istruzione \u00e8 alla riga 6, ovvero la chiamata del metodo &#8220;synchronize&#8221;. Non fateci troppo caso, inseritela. Chi di voi svilupper\u00e0 applicazioni con multithread o accesso a risorse condivise dovr\u00e0 sviluppare questo aspetto, per gli altri non \u00e8 nulla di importante.<\/p>\n<p>Ora non ci resta che inserire il codice che deve occuparsi della lettura del valore salvato. Tale lettura va eseguita, ovviamente, all&#8217;avvio dell&#8217;applicazione. Nel metodo &#8220;viewDidLoad&#8221;, quindi, aggiungiamo il codice seguente (dalla riga 14 alla 19):<\/p>\n<pre lang=\"objc\" line=\"1\" escaped=\"true\">\r\n-(void)viewDidLoad{\r\n \r\n \/\/ Qui vanno dichiarati username e password per accedere a Twitter\r\n NSString *username = @\"nome_utente\";\r\n NSString *password = @\"password\";\r\n \r\n \/\/ Create a TwitterEngine and set our login details.\r\n twitterEngine = [[MGTwitterEngine alloc] initWithDelegate:self];\r\n [twitterEngine setUsername:username password:password];\r\n \r\n \/\/ Get updates from people the authenticated user follows.\r\n [twitterEngine getFollowedTimelineFor:username since:nil startingAtPage:0];\r\n \r\nNSDate *dataUltimoAgg = [[NSUserDefaults standardUserDefaults] objectForKey:@\"data\"];\r\n if (dataUltimoAgg == nil) {\r\n     labelUltimoRefresh.text = @\"nessun refresh precedente\";\r\n }else{\r\n     labelUltimoRefresh.text = [[NSString alloc] initWithFormat:@\"%@\",dataUltimoAgg];\r\n }\r\n \r\n [spinner startAnimating];\r\n}\r\n<\/pre>\n<p>Come potete vedere, abbiamo definito un oggetto di tipo <em>NSDate<\/em>, che dovr\u00e0 contenere il valore della data che leggeremo dai salvataggi. Per leggere tale valore, utilizziamo un metodo appropriato, nel nostro caso &#8220;objectForKey&#8221;. Se, invece, avessimo dovuto leggere un numero intero avremmo utilizzato il metodo &#8220;integerForKey&#8221;. Sono speculari, insomma, a quelli visti per il salvataggio dei dati. Nella documentazione, comunque, trovate tutti i metodi disponibili.<br \/>\nAbbiamo poi eseguito un controllo su tale valore: nel caso l&#8217;oggetto sia nullo (quindi non \u00e8 stato letto niente), vuol dire che l&#8217;applicazione \u00e8 avviata per la prima volta, quindi scriviamo un testo appropriato. In caso contrario, inseriamo nella label la data letta.<\/p>\n<p>Abbiamo concluso anche il salvataggio dei dati!<\/p>\n<p><center><br \/>\n<a href=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/06\/creare-client-twitter-iPhone-parte-3-03.png\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/06\/creare-client-twitter-iPhone-parte-3-03.png\" alt=\"Creare un client twitter per iPhone (parte 3) - 03\" title=\"creare-client-twitter-iPhone-parte-3-03\" width=\"414\" height=\"770\" class=\"aligncenter size-full wp-image-3676\" srcset=\"https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/06\/creare-client-twitter-iPhone-parte-3-03.png 414w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/06\/creare-client-twitter-iPhone-parte-3-03-161x300.png 161w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/06\/creare-client-twitter-iPhone-parte-3-03-80x150.png 80w\" sizes=\"auto, (max-width: 414px) 100vw, 414px\" \/><\/a><br \/>\n<\/center><\/p>\n<p style=\"text-align: center;\"><a href=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/06\/SampleTwitterClient_parte3.zip\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/05\/download_icon.png\" alt=\"\" width=\"33\" height=\"40\" align=\"middle\" \/><\/a> Se avete problemi con il tutorial, <a href=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/06\/SampleTwitterClient_parte3.zip\">questo \u00e8 il nostro file di progetto.<\/a><\/p>\n<p>Con questa terza parte si chiude il tutorial dedicato alla creazione di un semplice client per Twitter. Spero che l&#8217;idea vi sia piaciuta, se avete altre idee da proporre, da sviluppare in maniera simile a questa non esitate a contattarci!<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Eccoci giunti con l&#8217;ultimo appuntamento dei nostri tutorial dedicati alla realizzazione di un semplice client per Twitter&#8230;.<\/p>\n","protected":false},"author":254,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[1],"tags":[258,259,257,260],"class_list":["post-3673","post","type-post","status-publish","format-standard","hentry","category-tutorial-pratici","tag-client-twitter","tag-nsdate","tag-nsuserdefault","tag-setobject"],"acf":[],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/posts\/3673","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/users\/254"}],"replies":[{"embeddable":true,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/comments?post=3673"}],"version-history":[{"count":3,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/posts\/3673\/revisions"}],"predecessor-version":[{"id":3756,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/posts\/3673\/revisions\/3756"}],"wp:attachment":[{"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/media?parent=3673"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/categories?post=3673"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/tags?post=3673"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}