Korrekte Verwendung des URLRequestConvertible von Alamofire
Gelesen habe ich paar tutorials, README-Datei von @mattt aber kann nicht herausfinden, paar Dinge.
- Was ist die richtige Verwendung von
URLRequestConvertible
in der realen Welt-API? Es sieht aus wie wenn ich einen erstellen-router durch die ImplementierungURLRequestConvertible
- Protokoll für alle API - es wird kaum noch lesbar. Sollte ich einen Router pro Endpunkt? - Zweite Frage, wahrscheinlich aufgrund mangelnder Erfahrung mit Swift Sprache. Ich kann nicht herausfinden, warum
enum
ist für den Bau verwendet router? Warum benutzen wir keine Klasse mit statischen Methoden?
hier ist ein Beispiel (von Alamofire README)enum Router: URLRequestConvertible { static let baseURLString = "http://example.com" static let perPage = 50 case Search(query: String, page: Int) //MARK: URLRequestConvertible var URLRequest: NSURLRequest { let (path: String, parameters: [String: AnyObject]?) = { switch self { case .Search(let query, let page) where page > 1: return ("/search", ["q": query, "offset": Router.perPage * page]) case .Search(let query, _): return ("/search", ["q": query]) } }() let URL = NSURL(string: Router.baseURLString)! let URLRequest = NSURLRequest(URL: URL.URLByAppendingPathComponent(path)) let encoding = Alamofire.ParameterEncoding.URL return encoding.encode(URLRequest, parameters: parameters).0 } }
- Gibt es 2 Möglichkeiten zum übergeben von Parametern:
case CreateUser([String: AnyObject]) case ReadUser(String) case UpdateUser(String, [String: AnyObject]) case DestroyUser(String)
und (sagen user hat 4 Parameter)
case CreateUser(String, String, String, String) case ReadUser(String) case UpdateUser(String, String, String, String, String) case DestroyUser(String)
@mattt ist mit dem ersten Beispiel. Aber das wird dazu führen, "hardcoding" Parameter' Namen außerhalb des Routers (z.B. in UIViewControllers).
Tippfehler im parameter name kann dazu führen, Fehler.
Andere Menschen sind mit der 2. option, aber in diesem Fall ist es nicht unbedingt offensichtlich, was die einzelnen parameter darstellt.
Was ist der richtige Weg, es zu tun?
InformationsquelleAutor der Frage OgreSwamp | 2015-02-04
Du musst angemeldet sein, um einen Kommentar abzugeben.
Großen Fragen. Lassen Sie uns brechen Sie diese einzeln.
Den
URLRequestConvertible
- Protokoll ist eine einfache Möglichkeit, um sicherzustellen, die ein bestimmtes Objekt erstellen können, die eine gültigeNSURLRequest
. Es gibt nicht wirklich einen strikten Satz von Regeln oder Richtlinien existieren, zwingt Sie zur Verwendung dieses Protokolls in einer bestimmten Art und Weise. Es ist nur eine Bequemlichkeit-Protokoll zu ermöglichen, andere Objekte zu speichern Zustand benötigt, um richtig zu erstellen, dieNSURLRequest
. Einige weitere Informationen in Bezug auf Alamofire finden hier.Definitiv nicht. Das würde die Niederlage der ganze Zweck der Verwendung eines
Enum
. Swift Enum-Objekte sind erstaunlich leistungsfähig, sodass Sie teilen eine große Menge an gemeinsamen Staat, und wechseln Sie auf die Teile, die tatsächlich anders. Die Erstellung einesNSURLRequest
mit etwas so einfaches wie das folgende ist wirklich mächtig!Enum wird verwendet, weil es ist sehr viel präziser Ausdruck mehrerer verwandter Objekte unter einem gemeinsamen interface. Alle Methoden sind geteilt zwischen den Fällen. Wenn Sie statische Methoden, Sie müsste eine statische Methode für jeden einzelnen Fall für jede Methode. Oder Sie verwenden würde eine Obj-C Stil enum innerhalb des Objekts. Hier ein kurzes Beispiel, was ich meine.
Um die Methode, die von jedem der verschiedenen Endpunkte können Sie die gleiche Methode, die zimmerreserviereung, ohne das Sie übergeben alle Parameter, die definieren, welche Art von Endpunkt die Sie suchen, es ist schon erledigt der Fall, Sie wählen.
Oder wenn Sie wollen, um den Pfad, gleiche Art der Anrufe.
Versuchen wir nun den gleichen Ansatz mit statischen Methoden.
Enums können maximieren Zustand und die Wiederverwendung von code. Die zugehörigen Werte können Sie auch tun, einige wirklich wichtige Dinge wie die Gruppierung von Objekten, die sind etwas ähnlich, aber haben unglaublich unterschiedliche Anforderungen...wie
NSURLRequest
Schöpfung.Das ist eine tolle Frage. Sie haben bereits verlegt, die aus zwei möglichen Optionen. Lassen Sie mich noch einen Dritten, der Ihre Anforderungen anpassen können ein bisschen besser.
In Fällen, In denen Sie die damit verbundenen Werte, ich glaube, es kann hilfreich sein, fügen Sie explizite Namen für alle Werte der Tupel. Diese wirklich hilft, bauen im Kontext. Der Nachteil ist, dass Sie dann deklarieren Sie diese Werte in Ihre switch-Anweisungen so gerne.
Während dies gibt Ihnen eine schöne, konsistente Rahmen, es wird ziemlich ausführlich. Das sind Ihre drei Möglichkeiten, in dem moment, in Swift, welches ist das richtige verwenden, hängt von Ihrem Anwendungsfall.
Update
Mit der Veröffentlichung von ?? Alamofire 4.0 ??, die
URLRequestConvertible
können jetzt VIEL klüger und können auch werfen. Wir haben Hinzugefügt volle Unterstützung in Alamofire für die Handhabung von ungültigen requests und Generierung sinnvoll, Fehler, die durch die response-Handler. Dieses neue system dokumentiert, die im detail in unserem README.InformationsquelleAutor der Antwort cnoon
Warum versuchen Sie nicht, zu verwenden SweetRouter. Es wird Ihnen helfen zu entfernen alle codebausteine, die Sie haben, wenn man erklärt, ein Router und es unterstützt auch solche Dinge wie mehrere Umgebungen und der code wird wirklich readible.
Hier ist ein Beispiel der Router mit süß-router:
Und hier ist, wie Sie es benutzen würden:
InformationsquelleAutor der Antwort Noobass
Habe ich einen Weg gefunden, mit ihm zu arbeiten, habe ich mir eine Klasse mit dem Router:
Erben von Klassen aus einer Anfrage
Datei anfordern.swift
Datei requestContacts.swift
so der Sohn-Klasse erhalten paramethers der Router von der Mutter, und Sie können sogar die Route.login in irgendeiner Sohn.
immer noch, weiß nicht, ob es ist ein Weg, um eine kurze URLRequest, so dass ich nicht brauchen, um die Parameter wieder und wieder
InformationsquelleAutor der Antwort David Alejandro Londoño Mejía
Hier ist die up-to-date
enum Router
im Swift 3, die empfehlen auf Alamofire s Github. Ich hoffe, Sie finden es nützlich im Hinblick auf die, wie Sie richtig zu implementieren, einen Router mitURLRequestConvertible
.InformationsquelleAutor der Antwort AndreasLukas
Typen die Annahme der URLRequestConvertible Protokoll kann verwendet werden, zum erstellen von URL-Anfragen.
Hier ist ein Beispiel, genommen von http://www.raywenderlich.com
und wir können das ImmageRouter wie die folgenden:
InformationsquelleAutor der Antwort Abo3atef