milliseconds. Swift 4 (AUG '17) - slow in Object Mapping. Compared Marshal, Decodable, Mapper, Genome by interface. Decided to use Marshal. (+Moya/Marshal extension for easier .mapArray(User.self) method on response)
sample data. Can be modified or changed to custom Stub Closure. // sampleData: Data in Github should be implemented // Create instance of target provider let githubProvider = MoyaProvider<Github>( stubClosure: MoyaProvider<Github>.immediatelyStub ) githubProvider .request(•cameras) { (result) in switch result { case .success(let response): let users: [User] = (try? response.mapArray()) ?? [] case .failure(let error): // Moya error } Map response data using Marshal extension. Sample data defined in Github TargetType will return here.
modified to change sample response, parameters, etc. Possible way to add Auth Token. // Custom Provider let githubProvider = MoyaProvider<Github>( endpointClosure: (TargetType) -> Endpoint<TargetType>, requestClosure: (Endpoint<TargetType>, @escaping MoyaProvider.RequestResultClosure) -> Void, stubClosure: (TargetType) -> StubBehavior, manager: Manager, plugins: [PluginType], ) .neverStub, .immediatelyStub, .delayedStub(seconds). Can be different based on target (with closure setup) Provider maps Endpoints to Request. Can be used to change cookie settings or other properties of URLRequest in Endpoint. Alamofire.Manager setup Side effects to modify network activity on different steps
a request before sending func prepare(_ request: URLRequest, target: TargetType) -> URLRequest /// Called immediately before a request is sent over the network (or stubbed). func willSend(_ request: RequestType, target: TargetType) /// Called after a response has been received, but before the MoyaProvider has invoked its completion handler. func didReceive(_ result: Result<Moya.Response, MoyaError>, target: TargetType) /// Called to modify a result before completion func process(_ result: Result<Moya.Response, MoyaError>, target: TargetType) -> Result<Moya.Response, MoyaError> } Default plugins in Moya: CredentialsPlugin - uses URLCredentials to authenticate NetworkActivityPlugin - tracks network activity began/finished with closure parameter NetworkLoggerPlugin - logs information on each stage (with print() or any other logger) AccessTokenPlugin - adds token with "Authorization: Bearer <token>" format
AccessTokenPlugin(token: "<long token>") // Provider + plugin let githubProvider = MoyaProvider<Github>( plugins: [plugin] ) Provider can use AccessTokenPlugin with Bearer <token> AccessTokenPlugin inserts token into every request header