A Response of a Request made in Frisbee will return an enum of Result<T>. Where T must be a decodable entity. In this guide it will be used a Movie entity like bellow.
struct Movie: Decodable {
let name: String
}
Making a Request
You could abstract Frisbee usage in some class and inject an object that conforms to Getable protocol. So, in production ready code you will use an instance of NetworkGet object.
class MoviesController {
private let getRequest: Getable
// Expect something that conforms to Getable
init(getRequest: Getable) {
self.getRequest = getRequest
}
func listMovies() {
getRequest.get(url: someUrl) { moviesResult: Result<[Movie]> in
switch moviesResult {
case let .success(movies): print(movies[0].name)
case let .fail(error): print(error)
}
}
}
}
// Who will call the MoviesController must inject a NetworkGet instance
MoviesController(getRequest: NetworkGet())
Query Parameters
It is easy to use query strings paramenters. Just create an Encodable struct and use it in get(url:query:onComplete:) method.
struct MovieQuery: Encodable {
let page: Int
}
let query = MovieQuery(page: 10)
NetworkGet().get(url: url, query: query) { (result: Result<Movie>) in
// ...
}
POST Request
Same way as GET request, Frisbee has a Postable protocol. And in prodution ready code you will use an instance of NetworkPost.
Making Request
It is the same logic as GET request.
class MoviesController {
private let postRequest: Postable
// Expect something that conforms to Postable
init(postRequest: Postable) {
self.postRequest = postRequest
}
func createMovie() {
postRequest.post(url: someUrl) { moviesResult: Result<[Movie]> in
switch moviesResult {
case let .success(movies): print(movies[0].name)
case let .fail(error): print(error)
}
}
}
}
Body Arguments
It is easy to use body paramenters. Just create an Encodable struct and use it in post(url:body:onComplete:) method.
struct MovieBody: Encodable {
let name: String
}
let body = MovieBody(name: "A New Movie")
NetworkPost().post(url: url, body: body) { (result: Result<Movie>) in
// ...
}
Usage in Tests
In test target code you can create your own Getable (or Postable as you needed) mock.
public class MockGet: Getable {
var decodableMock: Decodable!
public func get<Entity: Decodable>(url: URL, completionHandler: @escaping (Result<Entity>) -> Void) {
get(url: url.absoluteString, completionHandler: completionHandler)
}
public func get<Entity: Decodable>(url: String, completionHandler: @escaping (Result<Entity>) -> Void) {
if let decodableMock = decodableMock as? Entity {
completionHandler(.success(decodableMock))
}
}
}
And instead NetworkGet you will use to test the MockGet on MoviesController
class MoviesControllerTests: XCTestCase {
func testDidTouchAtListMoviesWhenHasMoviesThenPresentAllMovies() {
let mockGet = MockGet()
let movies = [Movie(name: "Star Wars")]
mockGet.decodableMock = movies
let controller = MoviesController(getRequest: mockGet)
controller.didTouchAtListMovies()
XCTAssertEqual(controller.moviesQuantity, movies.count)
}
}
Another network wrapper for URLSession. Built to be simple, small and easy to create tests at the network layer of your application.
Install
Carthage
To integrate Frisbee into your Xcode project using Carthage, specify it in your Cartfile:
Run carthage update to build the framework and drag the built Frisbee.framework into your Xcode project.
CocoaPods
To integrate Frisbee into your Xcode project using CocoaPods, specify it in your
Podfile
:Then, run the following command:
Swift Package Manager
To integrate Frisbee into your Swift Package Manager project, set the dependencies in your
Package.swift
:Usage
GET Request
Decodable Entity
A
Response
of aRequest
made in Frisbee will return an enum ofResult<T>
. WhereT
must be a decodable entity. In this guide it will be used aMovie
entity like bellow.Making a Request
You could abstract Frisbee usage in some class and inject an object that conforms to
Getable
protocol. So, in production ready code you will use an instance ofNetworkGet
object.Query Parameters
It is easy to use query
stringsparamenters. Just create anEncodable
struct and use it inget(url:query:onComplete:)
method.POST Request
Same way as GET request, Frisbee has a
Postable
protocol. And in prodution ready code you will use an instance ofNetworkPost
.Making Request
It is the same logic as GET request.
Body Arguments
It is easy to use body paramenters. Just create an
Encodable
struct and use it inpost(url:body:onComplete:)
method.Usage in Tests
In test target code you can create your own
Getable
(orPostable
as you needed) mock.And instead
NetworkGet
you will use to test theMockGet
onMoviesController
Frisbee Next Features
Telegram
To collaborate, resolve questions and find out what’s new about the Frisbee library, join the group on Telegram: https://t.me/FrisbeeLib