$30 off During Our Annual Pro Sale. View Details »

Enum Factories And Generic Data Sources

Enum Factories And Generic Data Sources

Presented at CocoaHeads Montreal on November 16th, 2017.

Olivier Collet

November 16, 2017
Tweet

More Decks by Olivier Collet

Other Decks in Programming

Transcript

  1. ENUM FACTORIES
    AND GENERIC DATA SOURCES
    OLIVIER COLLET. COCOAHEADS MONTREAL. 16.11.2017

    View Slide

  2. PHOTOS, PHOTOS, MORE PHOTOS
    • SEARCH
    • NEW FEED
    • COLLECTION
    • PHOTOGRAPHER

    View Slide

  3. SAME THING
    DIFFERENT SOURCE

    View Slide

  4. IT STARTS WITH
    A PAGED REQUEST
    I’ll spare you the details.
    The most important thing is this:
    struct Cursor {
    let page: Int
    let perPage: Int
    let parameters: [String: Any]?
    }

    View Slide

  5. THEN
    SUBCLASSES
    • For each API endpoint that uses paging
    • For photos and collections

    View Slide

  6. LET’S MOVE TO THE STUFF
    THE DATA SOURCE
    • It uses generics to handle photos and collections
    • It uses a factory to generate cursors and requests
    protocol PagedDataSourceFactory {
    func initialCursor() -> Cursor
    func request(with cursor: Cursor) -> PagedRequest
    }

    View Slide

  7. SO WHAT ABOUT THE FACTORY?
    THAT’S WHERE IT GETS REALLY
    enum PhotosDataSourceFactory: PagedDataSourceFactory {
    case photos(order: GetPhotosRequest.Order)
    case trending
    case search(query: String)
    case collection(identifier: String, curated: Bool)
    }

    View Slide

  8. WHAT ABOUT THAT PROTOCOL?
    IT’S GETTING
    func initialCursor() -> PagedRequest.Cursor {
    switch self {
    case .photos(let order):
    return GetPhotosRequest.cursor(with: order, page: 1, perPage: 20)
    case .trending:
    return GetHomePhotosRequest.cursor(with: nil)
    case .search(let query):
    return SearchPhotosRequest.cursor(with: query, page: 1, perPage: 20)
    ...
    }
    func request(with cursor: PagedRequest.Cursor) -> PagedRequest {
    switch self {
    case .photos(let order):
    return GetPhotosRequest(orderBy: order, page: cursor.page, perPage: cursor.perPage)
    case .trending:
    return GetHomePhotosRequest(with: cursor)
    case .search(let query):
    return SearchPhotosRequest(with: query, page: cursor.page, perPage: cursor.perPage)
    ...
    }

    View Slide

  9. FACTORY BONUS
    IT CREATES THE DATA SOURCE
    var dataSource: PagedDataSource {
    return PagedDataSource(with: self)
    }

    View Slide

  10. OK, BUT HOW TO USE THIS?
    The PhotosViewController uses a data source:
    var dataSource: PagedDataSource
    Which is set as easily as this:
    photosViewController.dataSource =
    PhotosDataSourceFactory.search(query:”summer").dataSource

    View Slide

  11. HOPE YOU ENJOYED
    QUESTIONS?

    View Slide


  12. Olivier Collet
    1-man wolf pack building all the native apps at Unsplash
    @ocollet

    View Slide