TABResourceLoader 9.0.0

TABResourceLoader 9.0.0

TestsTested
LangLanguage SwiftSwift
License MIT
ReleasedLast Release Jun 2020
SPMSupports SPM

Maintained by Neil Horton, Sam Dods, Kane Cheshire, Suyash Srijan.



  • By
  • Luciano Marisi

The App Business

TABResourceLoader

Build Status codecov.io

This library is designed to fetch resources in a consistent and modular way. The user can define resources by conforming to protocols that define where and how to get them. These resources can then be retrieved using a generic service type with or without an operation provided by the library. By following this approach it's easy to have testable and modular networking stack.

Example use cases

Working with a web service

High level architecture

This library defines/uses 4 concepts: model, resource, service and operation:

  1. Model: Strongly typed object in your codebase, may or may not be mapped 121 to the server model
  2. Resource: Defines through protocol conformance where and how to fetch a Model. For example a resource could define the URL of where a JSON file is and how to parse into strongly types model.
  3. Service: A type that knows how to retrieve a specific kind of Resource
  4. Operation: Provides a concurrency model when using a Service. Useful when implementing custom business logic such as throttling of fetches.

Resource protocols

Root protocols

  • ResourceType: Defines a generic Model
  • NetworkResourceType: Defines how an endpoint can be accessed. By specifying the following properties:
    • URL (Required)
    • HTTP method (Optional, default GET)
    • HTTP header fields (Optional)
    • Body of request (JSON encoded) (Optional)
    • URL query strings (Optional)

Conforming to ResourceType

  • DataResourceType: Defines a resource that can create a generic Model from (NS)Data

Conforming to DataResourceType

  • JSONDecodableResourceType: Defines the transformation from a JSON response into an object that conforms to Decodable
  • JSONDictionaryResourceType: Defines the transformation from a JSON object, i.e. [String: Any] to a generic Model
  • JSONArrayResourceType : Defines the transformation from a JSON array, i.e. [Any] to a generic Model
  • ImageResourceType: Defines the transformation from (NS)Data to a UIImage
  • PropertyListDecodableResourceType:

Protocols that inherit from multiple protocols

  • NetworkJSONDictionaryResourceType: Combines JSONDictionaryResourceType and NetworkResourceType to allow for retrieving a generic Model from a JSON dictionary from a web service.
  • NetworkJSONArrayResourceType: Combines JSONArrayResourceType and NetworkResourceType to allow for retrieving a generic Model from a JSON array from a web service.
  • NetworkJSONDecodableResourceType: Combines JSONDecodableResourceType and NetworkResourceType to allow for retrieving a generic Model from a JSON response from a web service.

Note: The above all include ["Content-Type": "application/json"] as default header fields.

  • NetworkPropertyListDecodableResourceType: Combines PropertyListDecodableResourceType and NetworkResourceType to allow for retrieving a generic Model from a Property List format XML response from a web service. It includes the ["Content-Type": "application/x-plist"] as default header fields.

Concrete types

  • NetworkImageResource: Conforms to ImageResourceType and can be initialized with a URL

Services

  • NetworkDataResourceService: Used to retrieve a resource that conforms to NetworkResourceType and DataResourceType
    • fetch function returns a Cancellable object which can be used to cancel the network request
    • When the network request finishes a completion handler is called with a NetworkResponse<Model> enum
  • GenericNetworkDataResourceService: Inherits NetworkDataResourceService and conforms toResourceServiceType. The purpose of this service is to be use with ResourceOperation

ResourceOperation

  • Uses a service that conforms to ResourceServiceType to retrieve a resource that conforms to ResourceType
  • Subclass of (NS)Operation used to retrieve a resource with specific service
  • Uses a completion handler when the operation is finished to pass it's Result

Contributing

Guidelines for contributing can be found here.

Author

Luciano Marisi @lucianomarisi

The original idea for this pattern is explained on Protocol oriented loading of resources from a network service in Swift

License

TABResourceLoader is available under the MIT license. See the LICENSE file for more info.