2017-02-21 4 views
1

Hier ist ein Beispiel eines Alamofire RouterGemäßer Gebrauch von Alamofire Router

import Foundation 
import Alamofire 

enum PostRouter: URLRequestConvertible { 
    static let baseURLString = "http://jsonplaceholder.typicode.com/" 

    case Get(Int) 
    case Create([String: AnyObject]) 
    case Delete(Int) 

    var URLRequest: NSMutableURLRequest { 
    var method: Alamofire.Method { 
     switch self { 
     case .Get: 
     return .GET 
     case .Create: 
     return .POST 
     case .Delete: 
     return .DELETE 
     } 
    } 

    let params: ([String: AnyObject]?) = { 
     switch self { 
     case .Get, .Delete: 
     return (nil) 
     case .Create(let newPost): 
     return (newPost) 
     } 
    }() 

    let url:NSURL = { 
     // build up and return the URL for each endpoint 
     let relativePath:String? 
     switch self { 
     case .Get(let postNumber): 
     relativePath = "posts/\(postNumber)" 
     case .Create: 
     relativePath = "posts" 
     case .Delete(let postNumber): 
     relativePath = "posts/\(postNumber)" 
     } 

     var URL = NSURL(string: PostRouter.baseURLString)! 
     if let relativePath = relativePath { 
     URL = URL.URLByAppendingPathComponent(relativePath) 
     } 
     return URL 
    }() 

    let URLRequest = NSMutableURLRequest(URL: url) 

    let encoding = Alamofire.ParameterEncoding.JSON 
    let (encodedRequest, _) = encoding.encode(URLRequest, parameters: params) 

    encodedRequest.HTTPMethod = method.rawValue 

    return encodedRequest 
    } 
} 

Was dies im Grunde tut, ist zu erstellen, löschen oder die Beiträge zu bekommen. Dieser Code sieht für eine einfache App, die genau das tut, sauber aus. Was ist mit einer App, die viele Endpunkte und Modelle enthält? Nehmen wir an, wir müssen verschiedene Operationen für Entitäten wie Benutzer, Firmen, Zahlungen, Kommentare, Kanäle usw. ausführen. Ich spreche von einer großen Anzahl von Endpunkten und Methoden.

In diesem Fall ist es notwendig, einen Router für jeden Endpunkt zu erstellen? Es fühlt sich nicht so an, ist es eine gute Übung, die gleiche Router-Klasse für alle diese Endpunkte zu verwenden.

Eine ähnliche Frage wurde hier gefragt: Proper usage of the Alamofire's URLRequestConvertible

Aber ich bin immer noch mit den Antworten auf obige Frage nicht erfüllt, da akzeptierte Antwort schlägt für alle Endpunkte gleiche Router zu verwenden. Was ist die beste Vorgehensweise hier?

Antwort

0

Zunächst sollten Sie nie Anfragen von View Controllern senden. Das ist einfach zu "stinkend".

Was Ihre Frage betrifft, kann es keine definitive Antwort geben. Netzwerk ist eine ausreichend große Aufgabe, die als separate Schicht in Ihrer App-Architektur implementiert werden kann. Wie man es implementiert ... Das ist wirklich eine schwierige Frage. Ich denke, es gibt so viele Möglichkeiten, wie viele Entwickler es gibt. Es hängt auch von der App-Architektur Muster Sie verwenden (MVC, MVP, VIPER, MVVM usw.)

Für mich, ich mache immer Vernetzung über Dienste. Ich habe eine Reihe von Klassen, die die Adressierung von AFNetworking/Alamofire kapseln. Und nur dedizierte Dienste adressieren diese Klassen (ein Dienst pro Konzept, z. B. Autorisierungsdienst, Benutzerdienst, Produktdienst, Was-auch-immer-anders-Dienst).

Ich empfehle Ihnen sicherlich, diese Frage zu untersuchen. Sie könnten damit beginnen, über Architekturmuster zu lesen, die ich oben erwähnt habe. Dann - speziell über Netzwerkebene. Zunächst - das könnte hilfreich sein:

https://talk.objc.io/episodes/S01E01-networking

Das Video hat mich einmal auf einige Ideen, die ich jetzt benutze. Aber erinnern Sie sich - keine Netzwerkanrufe in Ihrer Ansicht Controller =))

+1

Meine Frage ist eher tief und es ist in der Tat über eine separate Schicht (und sogar noch eine Abstraktionsschicht, wo sogar Alamofire ist nicht auf diese separate Netzwerkebene geklebt) . Dies ist eine weitere Ebene weiter als das, worüber Sie sprechen. Meine Frage bezieht sich also auf Best Practices bei der Verwendung von Alamofire Routern zur Implementierung einer Netzwerkabstraktionsschicht. – sleepwalkerfx