Vernetzung ist schwer. Es gibt verschiedene bewegliche Teile, und es müssen viele Faktoren berücksichtigt werden, damit es funktioniert. Glücklicherweise sind im Laufe der Zeit eine Reihe von Open-Source-Bibliotheken entstanden, um das Networking zu vereinfachen. AFNetworking, von den Menschen in Gowalla erstellt und verwaltet, ist eine solche Bibliothek. In diesem Lernprogramm lernen Sie das AFNetworking-Framework kennen und erfahren, wie Sie die iTunes Store-API abfragen!
In diesem Tutorial werde ich Ihnen AFNetworking vorstellen und Ihnen einen Einblick geben, was diese Bibliothek zu bieten hat. Nachdem Sie einige Minuten mit dieser Bibliothek verbracht haben, werden Sie feststellen, dass sie für eine einfache Verwendung konzipiert wurde. Es beschleunigt nicht nur Ihre Entwicklung, sondern erledigt auch viele mühsame Netzwerkaufgaben. Wir werden eine einfache Anwendung erstellen, die den iTunes Store nach Filmen abfragt, die dem Suchbegriff "harry" entsprechen. Die Ergebnisse unserer Abfrage werden in einer Tabellenansicht angezeigt.
Die Anwendung, die wir gerade erstellen, erstellt Abfragen der iTunes Store Search API. Insbesondere durchsuchen wir den iTunes Store nach Filmen, die dem Suchbegriff "Harry" entsprechen. Wenn unsere Abfrage erfolgreich ist, verarbeiten wir die Ergebnisse und zeigen sie in einer Tabellensicht an. Jede Zeile steht für einen Film mit einem Titel, einem Regisseur und einer Miniaturansicht, die die Filmgrafik zeigt. Bereit? Lass uns anfangen.
Bevor wir uns mit AFNetworking die Hände schmutzig machen, müssen wir eine Basis schaffen. Dies bedeutet, dass Sie unser Projekt einrichten, eine Tabellensicht erstellen und eine Aktivitätsindikatoransicht hinzufügen. Wir zeigen die Aktivitätsanzeige an, wenn unsere Anfrage vom iTunes Store verarbeitet wird. Dies gibt dem Benutzer das wertvolle zusätzliche Feedback, das oft übersehen wird.
Erstellen Sie ein neues Projekt in Xcode, indem Sie das auswählen Einzelansicht-Anwendung Vorlage aus der Liste der Vorlagen. Benennen Sie Ihre Bewerbung NetworkingIsFun, Geben Sie eine Firmenkennung ein, legen Sie "iPhone" für die Gerätefamilie fest und deaktivieren Sie "Storyboards verwenden". Sie können den Rest unberührt lassen, aber stellen Sie das sicher Verwenden Sie die automatische Referenzzählung wird geprüft. Sagen Sie Xcode, wo Sie Ihr Projekt speichern möchten und klicken Sie auf "Speichern"..
Obwohl Interface Builder großartig ist, baue ich meine Schnittstellen oft programmgesteuert, und das machen wir auch in diesem Tutorial. Dadurch können wir uns einfach auf den Code konzentrieren, ohne vom Interface Builder abgelenkt zu werden. Öffnen ViewController.h und erstellen Sie drei Instanzvariablen (ivars) sowie Eigenschaften für diese ivars. Da wir mit einer Tabellensicht arbeiten werden, vergessen Sie nicht, Ihren View-Controller an die anzupassen UITableViewDataSource und UITableViewDelegate Protokolle. Die Header-Datei Ihres View-Controllers sollte jetzt wie folgt aussehen:
#einführen@Interface ViewController: UIViewController UITableView * _tableView; UIActivityIndicatorView * _activityIndicatorView; NSArray * _movies; @property (nicht atomar, beibehalten) UITableView * tableView; @ property (nonatomic, keep) UIActivityIndicatorView * activityIndicatorView; @property (nichtatomisch, behalten) NSArray * -Filme; @Ende
Wenn Sie durch die Verwendung von Unterstrichen verwirrt sind, empfehle ich Ihnen, es hier zu lesen. Fühlen Sie sich frei, die Unterstriche auszulassen, wenn Sie der Meinung sind, dass sie hässlich aussehen oder sich unwohl fühlen. Abgesehen von den Unterstrichen sollte es keine Überraschungen geben. Wir erklären unser UITableView und UIActivityIndicatorView sowie ein NSArray, das wir verwenden werden, um die Ergebnisse zu speichern, die wir von unserer Suchabfrage erhalten. Bereit? Gehen wir zur Implementierungsdatei unseres View-Controllers.
Da wir drei Eigenschaften in unserer Header-Datei deklariert haben, müssen wir ihre Zugriffsmethoden in synthetisieren ViewController.m. Wenn die Unterstriche Sie verwirren, können Sie sie auch weglassen.
@synthesize tableView = _tableView, activityIndicatorView = _activityIndicatorView, movies = _movies;
In unserer viewDidLoad Auf diese Weise richten wir unsere Tabellen- und Aktivitätsindikatoransichten ein. Der folgende Code sollte zum größten Teil selbsterklärend sein. Wenn Sie noch nie eine Tabellenansicht eingerichtet haben, ohne den Interface Builder zu verwenden, werden möglicherweise einige Zeilen angezeigt, die Ihnen nicht vertraut sind. Anstatt die Tabellensicht im Interface Builder zu verschalten, kümmern wir uns darum im viewDidLoad Methode. Nach dem Aufruf der Superklasse ' viewDidLoad Auf diese Weise initialisieren wir unsere Tabellensicht mit einem Rahmen und einem Stil, und wir setzen unseren View-Controller als Datenquelle und Delegat unserer Tabellensicht. Wenn unsere Anwendung gestartet wird, blenden wir die Tabellenansicht aus, da uns nichts angezeigt werden kann, solange unsere Abfrage keine Ergebnisse zurückgibt. Bevor Sie die Tabellensicht als Untersicht zur Ansicht unseres Ansichtscontrollers hinzufügen, legen wir deren Maske für die automatische Größenänderung fest. Die Maske für die automatische Größenänderung definiert, wie die Größe der Tabellenansicht geändert werden soll, wenn die Größe der übergeordneten Ansicht - der Ansicht des Controller-Controllers, zu der wir die Tabellenansicht hinzufügen - geändert wird. Dies geschieht beispielsweise, wenn das Gerät gedreht wird. Verwirrt? Mach dir keine Sorgen darüber. Es ist nicht wichtig für diese Anwendung.
- (void) viewDidLoad [super viewDidLoad]; // Einrichten der Tabellenansicht self.tableView = [[UITableView-Zuordnung] initWithFrame: CGRectMake (0.0, 0.0, self.view.bounds.size.width, self.view.bounds.size.height) Stil: UITableViewStylePlain]; self.tableView.dataSource = self; self.tableView.delegate = self; self.tableView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight; self.tableView.hidden = JA; [self.view addSubview: self.tableView]; // Aktivitätsanzeige einrichten View self.activityIndicatorView = [[UIActivityIndicatorView allocation] initWithActivityIndicatorStyle: UIActivityIndicatorViewStyleGray]; self.activityIndicatorView.hidesWhenStopped = YES; self.activityIndicatorView.center = self.view.center; [self.view addSubview: self.activityIndicatorView]; [self.activityIndicatorView startAnimating]; // Datenquelle initialisieren self.movies = [[NSArray-Zuordnung] init];
Das Einrichten der Aktivitätsanzeige ist genauso einfach. Wir initialisieren die Aktivitätsindikatoransicht mit einem vordefinierten Stil und legen sie fest verstecktWennStop Eigentum an JA, und positionieren Sie es in der Mitte der übergeordneten Ansicht. Nachdem Sie es zur Ansicht des View-Controllers hinzugefügt haben, beginnen wir mit der Animation der Aktivitätsanzeige. Die Aktivitätsanzeige wird automatisch angezeigt, seit wir ihre Einstellung vorgenommen haben verstecktWennStop Eigenschaft zu JA.
Am Ende unseres viewDidLoad Methode initialisieren wir die Filme Array. Wir werden es später verwenden, um die Ergebnisse unserer Suchabfrage zu speichern.
In diesem Lernprogramm werden nur zwei Methoden des Datenquellenprotokolls TableView implementiert. Beide Methoden sind erforderlich. Dies ist die minimale Implementierung, die erforderlich ist, um unsere Tabellensicht einzurichten. Obwohl wir unseren View-Controller als Delegat der Tabellensicht festgelegt haben, werden in unserer Anwendung keine der Delegat-Methoden verwendet. Wenn Sie zuvor eine Tabellensicht verwendet haben, finden Sie in den unten gezeigten Methodenimplementierungen keine Überraschungen.
- (NSInteger) tableView: (UITableView *) tableView numberOfRowsInSection: (NSInteger) Abschnitt if (self.movies && self.movies.count) return self.movies.count; else return 0; - (UITableViewCell *) tableView: (UITableView *) tableView cellForRowAtIndexPath: (NSIndexPath *) indexPath statischer NSString * cellID = @ "Cell Identifier"; UITableViewCell * cell = [tableView dequeueReusableCellWithIdentifier: cellID]; if (! cell) cell = [[UITableViewCell-Zuordnung] initWithStyle: UITableViewCellStyleSubtitle reuseIdentifier: cellID]; Zelle zurückgeben;
Im tableView: numberOfRowsInSection:, Wir müssen die Anzahl der Zeilen in jedem Abschnitt der Tabellenansicht zurückgeben. In unserem Beispiel enthält die Tabellensicht nur einen Abschnitt (Standard), wodurch alles etwas einfacher wird. Zuerst prüfen wir ob Filme Die Variable ist nicht gleich Null und wir überprüfen, ob sie Elemente enthält. Wenn diese beiden Voraussetzungen erfüllt sind, wird die Anzahl der Elemente im Filmmatrixfeld zurückgegeben. Andernfalls wird Null zurückgegeben.
Unsere tableView: cellForRowAtIndexPath: Methode ist auch grundlegend. Wir fragen zunächst unsere Tabellensicht, ob es eine Zelle gibt, die wir wiederverwenden können. Ist dies nicht der Fall, erstellen wir eine neue Zelle mit einer Stil- und Wiederverwendungskennung. Wir beenden unsere Implementierung mit der Rückgabe unserer Zelle. Das wird fürs Erste tun. Sie können jetzt Ihre Anwendung erstellen und ausführen. Wenn Sie die Schritte richtig ausgeführt haben, sollte sich der Aktivitätsindikator wie verrückt drehen und die Tabellenansicht sollte ausgeblendet sein.
Das Hinzufügen von AFNetworking zu Ihrem Projekt ist kinderleicht. Laden Sie zunächst die Bibliothek von GitHub herunter und entpacken Sie das Archiv. Das Archiv enthält einen Ordner mit dem Namen AFNetworking, Diese enthält die Quelldateien, die wir in unser Projekt aufnehmen müssen. Ziehen Sie den gesamten Ordner in Ihr Xcode-Projekt und stellen Sie sicher, dass Sie dies überprüfen Elemente in den Ordner der Zielgruppe kopieren (falls erforderlich) und fügen Sie auch die Quelldateien zu Ihrem Ziel hinzu.
Nachdem Sie die AFNetworking-Bibliothek zu Ihrem Projekt hinzugefügt haben, können Sie Ihre Anwendung erstellen und ausführen und beobachten, wie alles auseinanderfällt. Was ist mit unserem Projekt passiert? Warum erhalten wir all diese Warnungen und Fehler? Als wir unser Xcode-Projekt eingerichtet haben, haben wir es aktiviert Automatische Referenzzählung (ARC). Zum Zeitpunkt des Schreibens verwendet die AFNetworking-Bibliothek ARC nicht. Machen Sie sich keine Sorgen, wir können diese übersichtliche Bibliothek dennoch mit sehr wenig Aufwand verwenden. Wir müssen dem Compiler nur mitteilen, dass alle Quelldateien der AFNetworking-Bibliothek ARC nicht verwenden. Das ist es.
Wie machen wir das? Wählen Sie Ihr Projekt in der Projektnavigator und wählen Sie Ihr Ziel. Drücke den Baue Phasen Registerkarte in der oberen Navigation und öffnen Sie die Quellen kompilieren Schublade. Diese Tabelle zeigt Ihnen alle Quelldateien, die der Compiler zur Kompilierzeit kompilieren wird. Die linke Spalte zeigt die Namen der Dateien und die rechte Spalte zeigt die Flags, über die der Compiler Bescheid wissen sollte.
Sie können diese Flags als Anweisungen oder Meldungen für den Compiler anzeigen. Sie müssen lediglich ein Compiler-Flag zu jeder Quelldatei der AFNetworking-Bibliothek hinzufügen. Wählen Sie dazu eine Quelldatei aus der Liste aus und doppelklicken Sie auf die Zelle in der rechten Spalte. In einem kleinen Fenster können Sie eine oder mehrere Compiler-Flags hinzufügen. In unserem Fall einfach tippen -fno-objc-arc und klicken Sie auf Erledigt. Dieses Flag teilt dem Compiler mit, dass die Quelldatei ARC nicht verwendet. Stellen Sie sicher, dass Sie dieses Kennzeichen allen zehn Quelldateien der AFNetworking-Bibliothek hinzufügen.
AFNetworking ist eine Bibliothek, die viel für Sie tun kann, aber heute werden wir nur zwei nette Funktionen nutzen. Bevor Sie die AFNetworking-Klassen verwenden können, müssen Sie die folgende import-Anweisung direkt unter der ersten import-Anweisung in der Implementierungsdatei Ihres View-Controllers hinzufügen.
#import "AFNetworking.h"
Diese Importanweisung gibt uns Zugriff auf alle AFNetworking-Klassen. Gehen Sie zurück zu unserem View-Controller viewDidLoad Methode und fügen Sie unmittelbar nach der Initialisierung des Filme Array.
NSURL * url = [[NSURL-Zuordnung] initWithString: @ "http://itunes.apple.com/search?term=harry&country=us&entity=movie"]; NSURLRequest * request = [[NSURLRequest Allocation] initWithURL: URL]; AFJSONRequestOperation * operation = [AFJSONRequestOperation JSONRequestOperationWithRequest: Anforderung erfolgreich: ^ (NSURLRequest * -Anforderung, NSHTTPURLResponse * -Antwort, ID JSON) NSLog (@ "% @", JSON); Fehler: ^ (NSURLRequest * -Anforderung, NSHTTPURLResponse * -Antwort, NSError * -Fehler, ID JSON) NSLog (@ "Fehler bei Anforderung fehlgeschlagen:% @,% @", Fehler, error.userInfo); ]; [Betriebsstart];
Lassen Sie mich erklären, was los ist. In der ersten Zeile erstellen wir die NSURL für unsere Anfrage. Die bei der Initialisierung verwendete Zeichenfolge entspricht dem Format, das die iTunes Store Search API erwartet. Die Syntax der Such-API ist ziemlich einfach: Der Begriff, den wir suchen, ist "harry", wir beschränken unsere Suche auf den US-iTunes Store und suchen nur nach Filmen. Einfach richtig?
Als Nächstes initialisieren wir ein NSURLRequest und übergeben die gerade erstellte NSURL. Dann setzt AFNetworking ein. AFNetworking enthält einige sehr spezielle Kurse, die unsere Arbeit sehr einfach machen. Die, die wir hier verwenden, ist AFJSONRequestOperation. Dies ist eine Klasse, mit der JSON-Daten im Hintergrund abgerufen und analysiert werden können. Wie der Name schon sagt, ist diese Klasse eine Unterklasse von NSOperation oder, genauer gesagt, eine der Superklassen dieser Klasse erbt von NSOperation. Mit der Klasse können Sie die angeforderten Daten abrufen und die JSON-Antwort parsen. Dies bedeutet, dass wir uns nicht mit rohem JSON befassen müssen. Die zurückgegebenen Daten können in Ihrer Anwendung verwendet werden. AFNetworking verwendet den integrierten JSON-Parser für iOS 5 und greift für ältere iOS-Versionen auf einen eigenen JSON-Parser zurück.
Die Verwendung von AFJSONRequestOperation ist einfach, da es nur eine Klassenmethode gibt. Diese Klassenmethode akzeptiert drei Argumente: (1) ein NSURLRequest, (2) einen Erfolgsblock, der ausgeführt wird, wenn die Anforderung erfolgreich ist, und (3) ein Fehlerblock, der ausgeführt wird, wenn die Anforderung fehlschlägt. Wenn Blöcke für Sie neu sind oder Sie nicht mit deren Verwendung vertraut sind, empfehle ich Ihnen, das Tutorial von Collin Ruffenach über Blöcke und Aufzählung bei Mobiletuts + zu lesen. Der Erfolgsblock benötigt drei Argumente: (1) unser NSURLRequest, (2) das NSHTTPURLResponse unserer Anfrage und (3) ein geparstes JSON-Objekt. Der Fehlerblock ist fast identisch. Der einzige Unterschied besteht darin, dass ein zusätzliches Argument erforderlich ist, ein NSError, der weitere Informationen darüber enthält, was bei einem Fehlschlagen unserer Anforderung fehlgeschlagen ist.
Zu Testzwecken protokollieren wir das analysierte JSON-Objekt, um festzustellen, was die iTunes Store Search-API an uns zurücksendet. Zusätzlich protokollieren wir den Fehler auch im Fehlerblock, falls unsere Anfrage fehlschlägt. Bevor Sie unsere Anwendung erneut erstellen und ausführen, müssen Sie die Operation durch Aufruf starten Start auf unserem Operationsobjekt. Erstellen und starten Sie Ihre Anwendung, und sehen Sie sich die Ausgabe in der Konsole an.
Wenn alles gut gegangen ist, werden die Ergebnisse unserer Anfrage in der Konsole protokolliert. Das analysierte JSON-Objekt ist ein Wörterbuch mit zwei Schlüsseln: (1) resultCount, welches die Anzahl der zurückgegebenen Ergebnisse und (2) die tatsächlichen Ergebnisse enthält Ergebnisse als ein Array von Wörterbüchern. Wir haben die Antwort nicht nur in der Konsole protokolliert, um zu sehen, ob unsere Anfrage erfolgreich war, sondern wir können jetzt die Schlüssel für jedes Element im Ergebnis-Array sehen. Wir benötigen diese Schlüssel, um einige Informationen in unserer Tabellenansicht anzuzeigen.
Wir sind jetzt bereit, die Ergebnisse in unserer Tabellenansicht anzuzeigen. Ersetzen Sie die Protokollanweisung im Erfolgsblock durch den unten gezeigten Ausschnitt. Wir beginnen mit der Zuweisung des Ergebnisfeldes des Antwortobjekts an das Filmmatrix. Jetzt müssen Sie nur noch die Aktivitätsanzeige ausblenden, indem Sie sie anhalten, die Tabellensicht anzeigen und die Tabellensicht mit den neuen Daten erneut laden, die im Filmmatrixfeld gespeichert sind.
self.movies = [JSON objectForKey: @ "results"]; [self.activityIndicatorView stopAnimating]; [self.tableView setHidden: NEIN]; [self.tableView reloadData];
Als nächstes ändern wir die tableView: cellForRowAtIndexPath: Methode. Passen Sie Ihre Implementierung so an, dass sie der folgenden Abbildung entspricht. Nachdem wir einen Verweis auf eine Zelle erhalten haben, fragen wir das Filmmatrixarray nach dem korrekten Element ab und aktualisieren die Beschriftungen der Zelle mit Titel und Regisseur des Films. Erstellen Sie Ihre Anwendung und führen Sie sie aus.
- (UITableViewCell *) tableView: (UITableView *) tableView cellForRowAtIndexPath: (NSIndexPath *) indexPath statischer NSString * cellID = @ "Cell Identifier"; UITableViewCell * cell = [tableView dequeueReusableCellWithIdentifier: cellID]; if (! cell) cell = [[UITableViewCell-Zuordnung] initWithStyle: UITableViewCellStyleSubtitle reuseIdentifier: cellID]; NSDictionary * movie = [self.movies objectAtIndex: indexPath.row]; cell.textLabel.text = [movie objectForKey: @ "Spurname"]; cell.detailTextLabel.text = [movie objectForKey: @ "artistName"]; zurück Zelle;
Möglicherweise haben Sie festgestellt, dass keine Miniaturbilder zu sehen sind. Beheben wir das, indem wir drei zusätzliche Zeilen hinzufügen tableView: cellForRowAtIndexPath: Methode. Erstellen Sie Ihre Anwendung und führen Sie sie aus.
NSURL * url = [[NSURL-Zuordnung] initWithString: [movie objectForKey: @ "artworkUrl100"]]; NSData * data = [NSData dataWithContentsOfURL: url]; cell.imageView.image = [[UIImage zuordnen] initWithData: data];
Haben Sie festgestellt, dass unsere Tabellenansicht nicht reibungslos scrollt. Warum das? Wie ich bereits in einem früheren Tutorial erwähnt habe, müssen Sie immer sicherstellen, dass der Haupt-Thread Ihrer Anwendung reaktionsfähig bleibt. In der aktuellen Umsetzung unseres tableView: cellForRowAtIndexPath: Methode laden wir die Thumbnails im Haupt-Thread herunter. Dies bedeutet, dass die Benutzeroberfläche nicht aktualisiert werden kann, bis eine Anforderung für ein Miniaturbild abgeschlossen ist. Unsere Miniaturansichten sind winzig, so dass die Bearbeitung der Anforderungen nicht zu lange dauert. Stellen Sie sich jedoch vor, bei größeren Assets den gleichen Ansatz zu verfolgen. Die Benutzererfahrung wäre schrecklich. Selbst für unsere einfache Anwendung ist die Benutzererfahrung inakzeptabel. Abhilfe können wir jedoch mit einer sehr nützlichen Funktion der AFNetworking-Bibliothek schaffen.
Die Entwickler von AFNetworking sahen auch die Notwendigkeit, Assets im Hintergrund herunterzuladen. Sie erstellten daher eine Kategorie für UIImageView. In dieser Kategorie können Sie Bilder mit nur zwei Zeilen Code im Hintergrund herunterladen. Diese Kategorie ist ein wahrer Lebensretter. Schauen Sie sich den Ausschnitt unten an.
NSURL * url = [[NSURL-Zuordnung] initWithString: [movie objectForKey: @ "artworkUrl100"]]; [cell.imageView setImageWithURL: url placeholderImage: [UIImage imageNamed: @ "Platzhalter"]];
Die erste Codezeile bleibt gleich. In der zweiten Zeile sagen wir der Bildansicht, wo sich die Miniaturansicht befindet, indem Sie eine NSURL übergeben, und wir übergeben ein Platzhalterbild, das angezeigt wird, solange unsere Anfrage keine Antwort zurückgegeben hat. Wie cool ist das? Alles, was wir tun müssen, ist, unserem Projekt ein Platzhalter-Image hinzuzufügen. Dies kann ein beliebiges Bild sein, aber Sie können das Bild, das ich als Platzhalter verwendet habe, in der Download-Datei finden, die diesem Lernprogramm beigefügt ist. Nachdem Sie das Platzhalterbild hinzugefügt haben, erstellen Sie Ihre Anwendung, führen Sie sie aus und testen Sie selbst, wie glatt die Tabellenansicht durchläuft!
Beachten Sie, dass unsere Anwendung sehr einfach ausgeführt wird, da sie keine Zwischenspeicherung vornimmt und wir den iTunes Store nur nach dem Begriff "Harry" im Abschnitt "Filme" durchsuchen können. Mit wenig Aufwand können Sie jedoch eine übersichtliche Anwendung erstellen, um den iTunes Store dynamischer zu durchsuchen.
Ich hoffe, dieses Tutorial hat Sie überzeugt, dass die AFNetworking-Bibliothek ein großartiges Werkzeug für Sie ist. Es kann viel mehr als das, was ich Ihnen in diesem Beitrag gezeigt habe, aber das Hauptziel dieses Tutorials ist es, Sie mit AFNetworking vertraut zu machen und es in einem realen Szenario einzusetzen.