{"id":3598,"date":"2010-06-03T11:04:22","date_gmt":"2010-06-03T09:04:22","guid":{"rendered":"http:\/\/www.devapp.it\/wordpress\/?p=3598"},"modified":"2010-06-03T11:04:54","modified_gmt":"2010-06-03T09:04:54","slug":"t049-creiamo-un-client-twitter-per-iphone-parte-1","status":"publish","type":"post","link":"https:\/\/www.devapp.it\/wordpress\/t049-creiamo-un-client-twitter-per-iphone-parte-1\/","title":{"rendered":"T#049 &#8211; Creiamo un client Twitter per iPhone (Parte 1)"},"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> Oggi vedremo come realizzare il nostro personalissimo client Twitter per iPhone! Vedremo, infatti, come sfruttare il progetto <strong>MGTwitterEngine<\/strong>, che ci permetter\u00e0 di interagire con il nostro account di Twitter. Utilizzeremo, inoltre, degli aspetti pi\u00f9 particolari e complessi dell&#8217;iPhone SDK.<\/p>\n<p>Ecco quello che faremo oggi:<\/p>\n<ul>\n<li>Inserire la libreria MGTwitterEngine nel nostro progetto e settarla in maniera corretta;<\/li>\n<li>Collegarci, sfruttando tale libreria, alla nostro timeline di Twitter;<\/li>\n<li>Ricavare i vari tweet della timeline e salvarli in una lista con elemento ad-hoc.<\/li>\n<\/ul>\n<p>Gi\u00e0 che siamo in tema, vi ricordo che il nostro canale Twitter \u00e8 raggiungibile a <a href=\"http:\/\/twitter.com\/iPhone_devapp\" target=\"_blank\">questo indirizzo<\/a>, vi invito a seguirci se ancora non lo fate! \ud83d\ude09<\/p>\n<p>Ora sotto con il codice, buon tutorial a tutti!<!--more--><\/p>\n<h4>1) Creiamo il progetto e settiamo la libreria &#8220;MGTwitterEngine&#8221;<\/h4>\n<p>Iniziamo creando un nuovo progetto di tipo &#8220;View-based application&#8221; e chiamiamolo &#8220;SampleTwitterClient&#8221;:<\/p>\n<p><center><br \/>\n<a href=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/06\/t049-tutorial-iphone-sdk-client-twitter-01.png\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/06\/t049-tutorial-iphone-sdk-client-twitter-01.png\" alt=\"Tutorial iPhone SDK - Client Twitter 01\" title=\"t049-tutorial-iphone-sdk-client-twitter-01\" width=\"500\" height=\"404\" class=\"aligncenter size-full wp-image-3602\" srcset=\"https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/06\/t049-tutorial-iphone-sdk-client-twitter-01.png 500w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/06\/t049-tutorial-iphone-sdk-client-twitter-01-300x242.png 300w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/06\/t049-tutorial-iphone-sdk-client-twitter-01-150x121.png 150w\" sizes=\"auto, (max-width: 500px) 100vw, 500px\" \/><\/a><br \/>\n<\/center><\/p>\n<p>Prima di fare qualsiasi altra cosa, inseriamo la libreria <strong>MGTwitterEngine<\/strong>, che ci permetter\u00e0 di interagire con Twitter. Scaricate l&#8217;ultima versione da <a href=\"http:\/\/svn.cocoasourcecode.com\/\" target=\"_blank\">questa repository SVN<\/a> (trovate <a href=\"http:\/\/www.bubidevs.net\/2009\/10\/30\/guida-come-scaricare-progetti-in-formato-svn\/\" target=\"_blank\">qui una guida<\/a> su come fare), oppure <a href=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/06\/MGTwitterEngine-1.0.8.zip\">scaricate la versione 1.08<\/a> che vi mettiamo noi a disposizione.<\/p>\n<p>Estraiamo l&#8217;archivio ed apriamo il file &#8220;MGTwitterEngine.xcodeproj&#8221;, un progetto esempio che potete guardare per avere una panoramica della libreria. La procedura che dovete eseguire \u00e8 spiegata nel file &#8220;README.txt&#8221; di questo progetto, ma vi illustrer\u00f2 tutti i passaggi in modo che non abbiate problemi di alcun genere.<\/p>\n<p>A noi interessa la cartella &#8220;MGTwitterEngine&#8221; che trovate all&#8217;interno di &#8220;Classes&#8221;:<\/p>\n<p><center><br \/>\n<a href=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/06\/t049-tutorial-iphone-sdk-client-twitter-02.png\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/06\/t049-tutorial-iphone-sdk-client-twitter-02.png\" alt=\"Tutorial iPhone SDK - Client Twitter 02\" title=\"t049-tutorial-iphone-sdk-client-twitter-02\" width=\"184\" height=\"243\" class=\"aligncenter size-full wp-image-3603\" srcset=\"https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/06\/t049-tutorial-iphone-sdk-client-twitter-02.png 184w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/06\/t049-tutorial-iphone-sdk-client-twitter-02-113x150.png 113w\" sizes=\"auto, (max-width: 184px) 100vw, 184px\" \/><\/a><br \/>\n<\/center><\/p>\n<p>Prendetela e trascinatela all&#8217;interno del nostro progetto &#8220;SimpleTwitterClient&#8221; che abbiamo creato poco fa:<\/p>\n<p><center><br \/>\n<a href=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/06\/t049-tutorial-iphone-sdk-client-twitter-03.png\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/06\/t049-tutorial-iphone-sdk-client-twitter-03.png\" alt=\"Tutorial iPhone SDK - Client Twitter 03\" title=\"t049-tutorial-iphone-sdk-client-twitter-03\" width=\"500\" height=\"293\" class=\"aligncenter size-full wp-image-3604\" srcset=\"https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/06\/t049-tutorial-iphone-sdk-client-twitter-03.png 500w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/06\/t049-tutorial-iphone-sdk-client-twitter-03-300x175.png 300w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/06\/t049-tutorial-iphone-sdk-client-twitter-03-150x87.png 150w\" sizes=\"auto, (max-width: 500px) 100vw, 500px\" \/><\/a><br \/>\n<\/center><\/p>\n<p>cliccate quidni su &#8220;Add&#8221; nella schermata che vi apparir\u00e0 appena rilascerete la cartella, ricordandovi di mettere il segno di spunta nell&#8217;opzione in alto:<\/p>\n<p><center><br \/>\n<a href=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/06\/t049-tutorial-iphone-sdk-client-twitter-04.png\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/06\/t049-tutorial-iphone-sdk-client-twitter-04.png\" alt=\"Tutorial iPhone SDK - Client Twitter 04\" title=\"t049-tutorial-iphone-sdk-client-twitter-04\" width=\"414\" height=\"388\" class=\"aligncenter size-full wp-image-3605\" srcset=\"https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/06\/t049-tutorial-iphone-sdk-client-twitter-04.png 414w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/06\/t049-tutorial-iphone-sdk-client-twitter-04-300x281.png 300w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/06\/t049-tutorial-iphone-sdk-client-twitter-04-150x140.png 150w\" sizes=\"auto, (max-width: 414px) 100vw, 414px\" \/><\/a><br \/>\n<\/center><\/p>\n<p>Possiamo chiudere il progetto &#8220;MGTwitterEngine&#8221; e tornare al nostro &#8220;SampleTwitterClient&#8221;. Importiamo, ora, il framework che si dovr\u00e0 occupare del <strong>parsing XML<\/strong>. Clicchiamo con il tasto destro sulla cartella &#8220;Frameworks&#8221; e scegliamo &#8220;Add&#8221; -> &#8220;Existing Frameworks\u2026&#8221;:<\/p>\n<p><center><br \/>\n<a href=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/06\/t049-tutorial-iphone-sdk-client-twitter-05.png\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/06\/t049-tutorial-iphone-sdk-client-twitter-05.png\" alt=\"Tutorial iPhone SDK - Client Twitter 05\" title=\"t049-tutorial-iphone-sdk-client-twitter-05\" width=\"500\" height=\"182\" class=\"aligncenter size-full wp-image-3606\" srcset=\"https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/06\/t049-tutorial-iphone-sdk-client-twitter-05.png 500w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/06\/t049-tutorial-iphone-sdk-client-twitter-05-300x109.png 300w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/06\/t049-tutorial-iphone-sdk-client-twitter-05-150x54.png 150w\" sizes=\"auto, (max-width: 500px) 100vw, 500px\" \/><\/a><br \/>\n<\/center><\/p>\n<p>Dall&#8217;elenco che appare selezioniamo poi &#8220;libxml2.dylib&#8221; e clicchiamo su &#8220;Add&#8221;:<\/p>\n<p><center><br \/>\n<a href=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/06\/t049-tutorial-iphone-sdk-client-twitter-06.png\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/06\/t049-tutorial-iphone-sdk-client-twitter-06.png\" alt=\"Tutorial iPhone SDK - Client Twitter 06\" title=\"t049-tutorial-iphone-sdk-client-twitter-06\" width=\"352\" height=\"398\" class=\"aligncenter size-full wp-image-3607\" srcset=\"https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/06\/t049-tutorial-iphone-sdk-client-twitter-06.png 352w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/06\/t049-tutorial-iphone-sdk-client-twitter-06-265x300.png 265w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/06\/t049-tutorial-iphone-sdk-client-twitter-06-132x150.png 132w\" sizes=\"auto, (max-width: 352px) 100vw, 352px\" \/><\/a><br \/>\n<\/center><\/p>\n<p>Abbiamo cos\u00ec importato il framework necessario.<\/p>\n<p>Ci manca solo un&#8217;operazione per fare in modo che la libreria &#8220;MGTwitterEngine&#8221; funzionioni alla perfezione. Facciamo doppio clic sul nome del progetto per aprirne le propriet\u00e0. Nella sezione &#8220;Build&#8221; cerchiamo la voce &#8220;Header Search Path&#8221;:<\/p>\n<p><center><br \/>\n<a href=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/06\/t049-tutorial-iphone-sdk-client-twitter-07.png\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/06\/t049-tutorial-iphone-sdk-client-twitter-07.png\" alt=\"Tutorial iPhone SDK - Client Twitter 07\" title=\"t049-tutorial-iphone-sdk-client-twitter-07\" width=\"499\" height=\"437\" class=\"aligncenter size-full wp-image-3608\" srcset=\"https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/06\/t049-tutorial-iphone-sdk-client-twitter-07.png 499w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/06\/t049-tutorial-iphone-sdk-client-twitter-07-300x262.png 300w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/06\/t049-tutorial-iphone-sdk-client-twitter-07-150x131.png 150w\" sizes=\"auto, (max-width: 499px) 100vw, 499px\" \/><\/a><br \/>\n<\/center><\/p>\n<p>facciamoci doppio clic e quando si apre inseriamoci la stringa &#8220;$SDKROOT\/usr\/include\/libxml2&#8221; (ci baster\u00e0 cliccare sul bottoncino &#8220;+&#8221;):<\/p>\n<p><center><br \/>\n<a href=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/06\/t049-tutorial-iphone-sdk-client-twitter-08.png\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/06\/t049-tutorial-iphone-sdk-client-twitter-08.png\" alt=\"Tutorial iPhone SDK - Client Twitter 08\" title=\"t049-tutorial-iphone-sdk-client-twitter-08\" width=\"490\" height=\"272\" class=\"aligncenter size-full wp-image-3609\" srcset=\"https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/06\/t049-tutorial-iphone-sdk-client-twitter-08.png 490w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/06\/t049-tutorial-iphone-sdk-client-twitter-08-300x166.png 300w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/06\/t049-tutorial-iphone-sdk-client-twitter-08-150x83.png 150w\" sizes=\"auto, (max-width: 490px) 100vw, 490px\" \/><\/a><br \/>\n<\/center><\/p>\n<p>Abbiamo concluso la fase iniziale di creazione del nostro progetto.<\/p>\n<h4>2.Definiamo la vista di caricamento<\/h4>\n<p>XCode ha gi\u00e0 creato per noi una vista, &#8220;SampleTwitterClientViewController.xib&#8221;. Questa verr\u00e0 caricata all&#8217;avvio dell&#8217;applicazione, sar\u00e0 qui che andremo a leggere la nostra timeline di Twitter. Prima di fare ci\u00f2, creiamo un semplice aspetto grafico per questa vista.<\/p>\n<p>Aprite il file &#8220;SampleTwitterClientViewController.xib&#8221; e modificatelo a vostro piacere. Io l&#8217;ho modificato cos\u00ec:<\/p>\n<p><center><br \/>\n<a href=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/06\/t049-tutorial-iphone-sdk-client-twitter-09.png\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/06\/t049-tutorial-iphone-sdk-client-twitter-09.png\" alt=\"Tutorial iPhone SDK - Client Twitter 09\" title=\"t049-tutorial-iphone-sdk-client-twitter-09\" width=\"400\" height=\"582\" class=\"aligncenter size-full wp-image-3610\" srcset=\"https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/06\/t049-tutorial-iphone-sdk-client-twitter-09.png 400w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/06\/t049-tutorial-iphone-sdk-client-twitter-09-206x299.png 206w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/06\/t049-tutorial-iphone-sdk-client-twitter-09-103x149.png 103w\" sizes=\"auto, (max-width: 400px) 100vw, 400px\" \/><\/a><br \/>\n<\/center><\/p>\n<p>Come vedete al centro ho inserito un componente &#8220;<strong>UIActivityIndicatorView<\/strong>&#8220;, che utilizzeremo per far capire all&#8217;utente che l&#8217;applicazione sta caricando i dati e non \u00e8 bloccata.<\/p>\n<p>Salviamo il file e chiudiamo Interface Builder.<\/p>\n<h4>3. Creiamo la classe &#8220;Tweet&#8221;<\/h4>\n<p>Come abbiamo gi\u00e0 detto, la nostra applicazione andr\u00e0 a <strong>leggere la timeline del nostro account di Twitter<\/strong>. Dobbiamo creare una classe, quindi, in grado di ospitare le informazioni di ogni singolo tweet letto. Per semplicit\u00e0, ci limiteremo a salvare solo alcuni dati di ogni tweet: nome dell&#8217;utente che ha &#8220;cinguettato&#8221;, la sua immagine del profilo e il testo del tweet.<\/p>\n<p>Facciamo clic con il tasto destro su &#8220;Classes&#8221; e clicchiamo poi su &#8220;Add&#8221; -> &#8220;New File\u2026&#8221;. Creiamo, quindi, una classe di tipo &#8220;Objective-C class&#8221; e chiamiamola &#8220;Tweet&#8221;.<\/p>\n<p>Vediamo di definire le variabili e i metodi di questa classe.<\/p>\n<p>Nel file &#8220;Tweet.h&#8221; inseriamo il seguente codice:<\/p>\n<pre lang=\"objc\" line=\"1\" escaped=\"true\">\r\n#import <Foundation\/Foundation.h>\r\n \r\n@interface Tweet : NSObject {\r\n NSString *testo;\r\n NSString *user;\r\n UIImage *immagine;\r\n}\r\n \r\n@property (nonatomic, retain) NSString *testo;\r\n@property (nonatomic, retain) NSString *user;\r\n@property (nonatomic, retain) UIImage *immagine;\r\n<\/pre>\n<p>Abbiamo dichiarato tre elementi, come detto poco fa:<\/p>\n<ul>\n<li>testo, conterr\u00e0 il messaggio del tweet, il testo;<\/li>\n<li>user, conterr\u00e0 l&#8217;username di chi ha inserito il tweet letto;<\/li>\n<li>immagine, \u00e8 l&#8217;immmagine (l&#8217;avatar) dell&#8217;utente che ha lasciato il tweet.<\/li>\n<\/ul>\n<p>Niente di complicato quindi. Nel file &#8220;Tweet.m&#8221; dovremo solo implementare il metodo &#8220;dealloc&#8221; e inserire &#8220;@synthesize&#8221;:<\/p>\n<pre lang=\"objc\" line=\"1\" escaped=\"true\">\r\n#import \"Tweet.h\"\r\n \r\n@implementation Tweet\r\n \r\n@synthesize testo, user, immagine;\r\n \r\n-(void)dealloc{\r\n [testo release];\r\n [user release];\r\n [immagine release];\r\n [super dealloc];\r\n}\r\n \r\n@end\r\n<\/pre>\n<p>Ovviamente se intendete creare un client pi\u00f9 complesso potrete aumentare i componenti di questa classe, ma per questo tutorial ci basteranno questi elementi.<\/p>\n<h4>4. Definiamo la classe &#8220;SampleTwitterClientViewController.h&#8221;<\/h4>\n<p>\u00c8 venuto finalmente il momento di implementare la classe che si occuper\u00e0 di leggere la timeline di Twitter.<\/p>\n<p>Apriamo il file &#8220;SampleTwitterClientViewController.h&#8221; e inseriamo il seguente codice:<\/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 \r\n@interface SampleTwitterClientViewController : UIViewController <MGTwitterEngineDelegate> {\r\n MGTwitterEngine *twitterEngine;\r\n NSMutableArray *listaTweet;\r\n IBOutlet UIActivityIndicatorView *spinner;\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 \r\n@end\r\n<\/pre>\n<p>Alla riga 7 abbiamo definito un elemento di tipo &#8220;MGTwitterEngine&#8221;, proprio quello della classe che abbiamo inserito all&#8217;inizio del tutorial. Sar\u00e0 questo componente che si occuper\u00e0 della connessione con Twitter e della lettura della nostra timeline. Nell&#8217;intestazione (riga 6) abbiamo anche inserito il protocollo di questa classe, che ci &#8220;obbliga&#8221; cos\u00ec ad implementare nei metodi che vedremo in seguito.<\/p>\n<p>L&#8217;array dichiarato alla riga 8 conterr\u00e0 vari elementi del tipo &#8220;Tweet&#8221;, ognuno dei quali conterr\u00e0 un tweet letto dal nostro account. Sar\u00e0, quindi, una lista che conterr\u00e0 tutti i tweet della nostra timeline.<br \/>\nLa riga 9, invece, contiene la definizione della &#8220;spinning wheel&#8221;, ovvero la classica &#8220;rotella che gira&#8221;, l&#8217;<em>UIActivityIndicatorView<\/em> che abbiamo inserito in precedenza nella vista (e che collegheremo fra poco tramite IB).<\/p>\n<p>Ci sono poi 3 metodi getter (&#8220;getMessaggio&#8221;, &#8220;getUser&#8221; e &#8220;getUrlImage&#8221;) che avranno il compito di ricavare il campo desiderato, partendo dal <strong>NSDictionary<\/strong>, in cui saranno memorizzate tutte le informazioni di ogni singolo tweet.<\/p>\n<p>Salviamo la classe e prima di continuare l&#8217;implementazione, apriamo nuovamente il file &#8220;SampleTwitterClientViewController.xib&#8221;, in cui dovremo collegare l&#8217;elemento &#8220;UIActivityIndicatorView&#8221; che abbiamo inserito con quello appena dichiarato nella classe.<\/p>\n<p>Clicchiamo sul &#8220;File&#8217;s Owner&#8221; e andiamo nel &#8220;Connections Inspector&#8221;. Colleghiamo l&#8217;elemento &#8220;spinner&#8221; con il componente grafico che abbiamo gi\u00e0 inserito. Se avete eseguito tutto correttamente avrete il seguente risultato:<\/p>\n<p><center><br \/>\n<a href=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/06\/t049-tutorial-iphone-sdk-client-twitter-10.png\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/06\/t049-tutorial-iphone-sdk-client-twitter-10.png\" alt=\"Tutorial iPhone SDK - Client Twitter 10\" title=\"t049-tutorial-iphone-sdk-client-twitter-10\" width=\"301\" height=\"209\" class=\"aligncenter size-full wp-image-3611\" srcset=\"https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/06\/t049-tutorial-iphone-sdk-client-twitter-10.png 301w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/06\/t049-tutorial-iphone-sdk-client-twitter-10-300x208.png 300w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/06\/t049-tutorial-iphone-sdk-client-twitter-10-150x104.png 150w\" sizes=\"auto, (max-width: 301px) 100vw, 301px\" \/><\/a><br \/>\n<\/center><\/p>\n<p>Possiamo salvare e chiudere Interface Builder.<\/p>\n<h4>5. Leggiamo i tweet dalla nostra timeline<\/h4>\n<p>Iniziamo ad implementare il codice che deve leggere i tweet dalla nostra timeline. Apriamo il file &#8220;SampleTwitterClientViewController.m&#8221; ed inseriamo il seguente codice:<\/p>\n<pre lang=\"objc\" line=\"1\" escaped=\"true\">\r\n#import \"SampleTwitterClientViewController.h\"\r\n#import \"Tweet.h\"\r\n \r\n@implementation SampleTwitterClientViewController\r\n \r\n@synthesize listaTweet, spinner;\r\n \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\n [spinner startAnimating];\r\n}\r\n<\/pre>\n<p>Non preoccupatevi troppo di capire il codice, in quanto l&#8217;ho preso direttamente dall&#8217;esempio fornito con la classe &#8220;MGTwitterEngine&#8221;. Ricordatevi, comunque, di inserire i vostri dati per il login alla riga 11 e 12.<br \/>\nAlla riga 21 abbiamo, inoltre, avviato la &#8220;rotella&#8221; (che fermeremo quando la procedura di lettura e conversione dei dati sar\u00e0 terminata).<\/p>\n<p><strong>Nota:<\/strong> se invece volete leggere i messaggi di un utente (non la sua timeline, ma solo i suoi tweet) dovete sostituire l&#8217;istruzione alla riga 19 con la seguente:<\/p>\n<pre lang=\"objc\" line=\"1\" escaped=\"true\">\r\n[twitterEngine getUserTimelineFor:username sinceID:nil startingAtPage:0 count:5];\r\n<\/pre>\n<p>Inseriamo, ora, dei metodi obbligatori da inserire, in quanto parte del delegato &#8220;MGTwitterEngineDelegate&#8221;.<\/p>\n<p>Eccoli:<\/p>\n<pre lang=\"objc\" line=\"1\" escaped=\"true\">\r\n- (void)requestSucceeded:(NSString *)requestIdentifier{\r\n NSLog(@\"Request succeeded (%@)\", requestIdentifier);\r\n}\r\n \r\n- (void)requestFailed:(NSString *)requestIdentifier withError:(NSError *)error{\r\n NSLog(@\"Twitter request failed! (%@) Error: %@ (%@)\",\r\n requestIdentifier,\r\n [error localizedDescription],\r\n [[error userInfo] objectForKey:NSErrorFailingURLStringKey]);\r\n [spinner stopAnimating];\r\n UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@\"Errore!\" message:@\"Connessione non riuscita.\\nControlla i dati d'accesso\" delegate:self cancelButtonTitle:@\"OK\" otherButtonTitles:nil];\r\n <div class=\"alert\"><button type=\"button\" class=\"close\">&#215;<\/button><div class=\"clear\"><\/div><\/div>;\r\n <div class=\"alert\"><button type=\"button\" class=\"close\">&#215;<\/button><div class=\"clear\"><\/div><\/div>;\r\n}\r\n \r\n- (void)directMessagesReceived:(NSArray *)messages forRequest:(NSString *)identifier{\r\n NSLog(@\"Got direct messages:\\r%@\", messages);\r\n}\r\n \r\n- (void)userInfoReceived:(NSArray *)userInfo forRequest:(NSString *)identifier{\r\n NSLog(@\"Got user info:\\r%@\", userInfo);\r\n}\r\n \r\n- (void)miscInfoReceived:(NSArray *)miscInfo forRequest:(NSString *)identifier{\r\n NSLog(@\"Got misc info:\\r%@\", miscInfo);\r\n}\r\n<\/pre>\n<p>L&#8217;unico metodo a cui ho aggiunto un po&#8217; di codice \u00e8 il secondo, ovvero &#8220;requestFailed: withError:&#8221;. Questo metodo \u00e8 avviato se la connessione con Twitter non \u00e8 possibile, in tal caso, avvieremo una <em>UIAlertView<\/em> che lo comunica all&#8217;utente e fermiamo l&#8217; UIActivityIndicator. Come messaggio comunichiamo che i dati d&#8217;accesso sono errati, in realt\u00e0 dovremmo controllare il codice d&#8217;errore e inserire un messaggio a seconda dell&#8217;errore riscontrato (potrebbe non esserci la connessione, oppure Twitter potrebbe essere down, o i dati inseriti potrebbero essere errati, etc).<\/p>\n<p>Mancano solo pochi metodi per concludere questo primo tutorial. Ecco cosa dovremo inserire ora:<\/p>\n<pre lang=\"objc\" line=\"1\" escaped=\"true\">\r\n- (void)statusesReceived:(NSArray *)statuses forRequest:(NSString *)identifier{\r\n \r\n listaTweet = [[NSMutableArray alloc] init];\r\n Tweet *elemento;\r\n \r\n for (int i=0; i&lt;statuses.count ; i++) {\r\n elemento =  [[Tweet alloc] init];\r\n elemento.testo = [self getMessaggio:[statuses objectAtIndex:i]];\r\n elemento.user = [self getUser:[statuses objectAtIndex:i]];\r\n elemento.immagine = [[UIImage imageWithData:[NSData dataWithContentsOfURL:[self getUrlImage:[statuses objectAtIndex:i]]]]retain];\r\n [listaTweet addObject:elemento];\r\n }\r\n [elemento release];\r\n \r\n [spinner stopAnimating];\r\n}\r\n \r\n-(NSString*)getMessaggio:(NSDictionary*)element{\r\n\treturn [element objectForKey:@\"text\"];\r\n}\r\n \r\n-(NSString*)getUser:(NSDictionary*)element{\r\n\treturn [[element objectForKey:@\"user\"] objectForKey:@\"name\"];\r\n}\r\n \r\n-(NSURL*)getUrlImage:(NSDictionary*)element{\r\n\tNSString *url = [[element objectForKey:@\"user\"] objectForKey:@\"profile_image_url\"];\r\n\treturn [NSURL URLWithString:url];\r\n}\r\n<\/pre>\n<p>Questa \u00e8 sicuramente la parte pi\u00f9 importante. Il metodo &#8220;statusesReceived&#8221; viene richiamato quando \u00e8 stata letta la timeline di Twitter del vostro account. Nell&#8217;array &#8220;statuses&#8221;, infatti, sono presenti tutti i tweet letti con tutti gli elementi relativi ad ogni singolo tweet (testo, username di chi lo ha lasciato, posizione della &#8220;geolocalizzazione&#8221;, url dell&#8217;immagine del profilo, etc). Se volete visualizzarne il contenuto vi baster\u00e0 usare l&#8217;istruzione <strong>NSLog(@&#8221;%@&#8221;,statuses);<\/strong>.<\/p>\n<p>Il codice presente nel metodo appena descritto si occupa di leggere ogni tweet e di ricavarne le informazioni del tweet che ci servono (testo, username e immagine). I tre metodi &#8220;getXXX&#8221; hanno proprio il compito di ricavare l&#8217;informazione (se volete leggere nuovi campi dovrete creare un metodo &#8220;get&#8221; personalizzandolo in base alle vostre necessit\u00e0). Potete vedere come sia molto semplice leggere le informazioni dei vari campi, vi baster\u00e0 infatti utilizzare il metodo &#8220;objectForKey&#8221; e inserire l&#8217;attributo che volete leggere.<\/p>\n<p><strong>Nota:<\/strong> il metodo &#8220;getUser&#8221; ci restitusce il nome completo dell&#8217;utente di cui abbiamo letto il messaggio. Se volete, invece, leggerne solo il nickname, dovrete utilizzare questa istruzione (riga 23):<\/p>\n<pre lang=\"objc\" line=\"1\" escaped=\"true\">\r\nreturn [[element objectForKey:@\"user\"] objectForKey:@\"screen_name\"];\r\n<\/pre>\n<p>Quello che potrebbe sembrarvi pi\u00f9 complicato \u00e8 la lettura dell&#8217;immagine. Il metodo &#8220;getUrlImage&#8221; ci restituisce un elemento <strong>NSURL<\/strong>, che non \u00e8 nient&#8217;altro che l&#8217;indirizzo web dell&#8217;immagine dell&#8217;utente. Alla riga 10 creiamo, poi, un&#8217;immagine a partire dai dati letti a quell&#8217;indirizzo (XCode ci restituisce infatti una NSData, che va convertita in UIImage). L&#8217;immagine convertita viene poi inserita nell&#8217;elemento corrente (ovviamente nel campo &#8220;immagine&#8221;).<\/p>\n<p>Alla fine del <em>ciclo for<\/em> avremo la &#8220;listaTweet&#8221; che conterr\u00e0 <em>n<\/em> elementi di tipo <em>Tweet<\/em>, ognuno dei quali avr\u00e0 le informazioni ricavate in precedenza. Proprio ci\u00f2 che volevamo.<\/p>\n<p>Abbiamo cos\u00ec completato questa prima parte del tutorial!<\/p>\n<p>Se volete controllare di aver letto i valori della vostra timeline, utilizzate questo ciclo alla fine del metodo &#8220;statusesReceived&#8221;:<\/p>\n<pre lang=\"objc\" line=\"1\" escaped=\"true\">\r\nfor (int j=0; j&lt;[listaTweet count]; j++) {\r\n Tweet *elemento = [listaTweet objectAtIndex:j];\r\n NSLog(@\"testo: %@, user: %@, url: %@\",elemento.testo,elemento.user,elemento.urlImgUser);\r\n }\r\n<\/pre>\n<p>e leggete i risultati nella Console di debug.<\/p>\n<p><center><br \/>\n<a href=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/06\/t049-tutorial-iphone-sdk-client-twitter-11.png\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/06\/t049-tutorial-iphone-sdk-client-twitter-11.png\" alt=\"Tutorial iPhone SDK - Client Twitter 11\" title=\"t049-tutorial-iphone-sdk-client-twitter-11\" width=\"376\" height=\"700\" class=\"aligncenter size-full wp-image-3612\" srcset=\"https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/06\/t049-tutorial-iphone-sdk-client-twitter-11.png 376w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/06\/t049-tutorial-iphone-sdk-client-twitter-11-161x300.png 161w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/06\/t049-tutorial-iphone-sdk-client-twitter-11-80x150.png 80w\" sizes=\"auto, (max-width: 376px) 100vw, 376px\" \/><\/a><br \/>\n<\/center><\/p>\n<p>Nel prossimo tutorial vedremo come creare una tabella personalizzata in cui inserire gli elementi che abbiamo letto.<\/p>\n<p><center><br \/>\n<a href=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/05\/SimpleRSSreader.zip\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone\" 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_parte1.zip\">questo \u00e8 il nostro file di progetto.<\/a><br \/>\n<\/center><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Oggi vedremo come realizzare il nostro personalissimo client Twitter per iPhone! Vedremo, infatti, come sfruttare il progetto&#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":[216,248,251,249,250],"class_list":["post-3598","post","type-post","status-publish","format-standard","hentry","category-tutorial-pratici","tag-andrea-busi","tag-mgtwitterengine","tag-nsdictionary","tag-twitter","tag-uiactivityindicatorview"],"acf":[],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/posts\/3598","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=3598"}],"version-history":[{"count":2,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/posts\/3598\/revisions"}],"predecessor-version":[{"id":3614,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/posts\/3598\/revisions\/3614"}],"wp:attachment":[{"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/media?parent=3598"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/categories?post=3598"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/tags?post=3598"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}