Skip to main content

Carlos - flexible and powerful cache layers in your application

Carlos is a small set of classes, functions and convenience operators to realize custom, flexible and powerful cache layers in your application.
By default, Carlos ships with an in-memory cache, a disk cache and a simple network fetcher(disk cache and network fetcher are inspired by HanekeSwift).
With Carlos you can:
  • create levels and fetchers depending on your needs, either through classes or with simple closures
  • combine levels
  • transform the key each level will get, or the values each level will output (this means you're free to implement every level independing on how it will be used later on). Some common value transformers are already provided with Carlos
  • Apply post-processing steps to a cache level, for example sanitizing the output or resizing images
  • react to memory pressure events in your app
  • automatically populate upper levels when one of the lower levels fetches a value for a key, so the next time the first level will already have it cached
  • enable or disable specific levels of your composed cache depending on boolean conditions
  • easily pool requests so you don't have to care whether 5 requests with the same key have to be executed by an expensive cache level before even only 1 of them is done. Carlos can take care of that for you
  • setup multiple lanes for complex scenarios where, depending on certain keys or conditions, different caches should be used
  • Cap the number of concurrent requests a cache should handle
  • have a type-safe complex cache that won't even compile if the code doesn't satisfy the type requirements
WeltN24


By the way, there is Brandon Case talking about Carlos at the Commercial Users of Functional Programming (CUFP) September 2016 in Nara, Japan!

Composable Caching in Swift
Slides

iOSCon 2017


There are even new Carlos-inspired project coming up:
Shallows

Shallows is a generic abstraction layer over lightweight data storage and persistence. It provides a Storage type, instances of which can be easily transformed and composed with each other. It gives you an ability to create highly sophisticated, effective and reliable caching/persistence solutions.

Shallows is deeply inspired by Carlos and this amazing talk by Brandon Kase.

Shallows is a really small, component-based project, so if you need even more controllable solution – build one yourself! Our source code is there to help.

GitHub




Comments

Most Favorite Posts

Dark Theme (Dark Mode) in Android WebViews, WKWebViews and CSS

So your apps just implemented a shiny new dark theme and it’s looking 👌 There are lots of benefits to having a dark theme in your application, and having it consistent throughout your application allows for a great user experience. But what happens when the the user runs into a WebView in your app? Support: if (WebViewFeature.isFeatureSupported(WebViewFeature.FORCE_DARK)) { ... } Set: WebSettingsCompat.setForceDark(webView.settings, WebSettingsCompat.FORCE_DARK_ON) Current setting: val forceDarkMode = WebSettingsCompat.getForceDark(webView.settings) Joe Birch Assuming your question is asking how to change the colors of the HTML content you are displaying in a WKWebView based on whether light or dark mode is in effect, there is nothing you do in your app's code. All changes need to be in the CSS being used by your HTML content. CSS dark mode via :root variables, explicit colors and @media query: :root {     color-scheme: light dark;      ...

Sencha Animator

Rich CSS3 ads for every mobile platform. Captivate your audience. Engage your customers. Standards-based animation has never been so easy. With the power of Sencha Animator, use CSS3 animations to build the next generation rich-media ads. Animate text and images with smooth transitions, design buttons with gradients, and embed analytics. All backed by the strength of web standards. Whether it’s zooming through space, challenging foes to kung fu, or showing off your latest line of amazing products, Sencha Animator elevates your creative experience and deploys on all of today’s most popular devices. Complete output control. Animator’s output is clean and human readable. Designers unfamiliar with web programming can leverage CSS3, while advanced users have complete control over the output. Better design experience. Superior results. Animator gives artists the freedom to design and fully deliver on innovative ideas, generate better customer engagement, and drive higher client RO...

Server-driven UI (SDUI): Meet Zalandos AppCraft and AirBnB Lona

A short WTF: Joe Birch:  SERVER DRIVEN UI, PART 1: THE CONCEPT Zalando seems to follow the SDUI principle as well - defining a common design language and construct the screens on the backend while displaying them natively on the clients. They even go one step further; they implemented a mighty toolset to enable non-technical stakeholders to define their own native app screens Compass: Web tooling to create screens and bind data Beetroot: Backend service that combines the screen layout definition with the data Lapis/Golem: iOS/Android UI render engines Crazy cool! Good job, guys (when you do an open-source release?) To even move faster a Flutter based UI render engine implementation was great! See also AirBnB Lona SDUI approach Building a Visual Language Why Dropbox sunsetted its universal C++ mobile project and AirBnB its React Native implementation

How to link to TestFlight App in iOS

There are two things you need to do. First, check to see if TestFlight is installed. Then create a new link to your app. NSURL *customAppURL = [NSURL URLWithString:@"itms-beta://"]; if ([[UIApplication sharedApplication] canOpenURL:customAppURL]) {     // TestFlight is installed     // Special link that includes the app's Apple ID     customAppURL = [NSURL URLWithString:@"https://beta.itunes.apple.com/v1/app/978489855"];      [[UIApplication sharedApplication] openURL:customAppURL]; } This special https://beta.itunes.apple.com URL will be opened directly in TestFlight. Finally, if you are using iOS 9 (or later), you need to make an addition to your Info.plist to get the canOpenURL: method to work. If your app is linked on or after iOS 9.0, you must declare the URL schemes you want to pass to this method. Do this by using the LSApplicationQueriesSchemes array in your Xcode project’s Info.plist file. For each URL scheme you wan...

Check SSL server certificate in App

How to check SSL server certificate in App to avoid man-in-the-middle attacks. - (BOOL)connection:(NSURLConnection *)connection canAuthenticateAgainstProtectionSpace:(NSURLProtectionSpace *)protectionSpace  {     SecTrustRef trust = [protectionSpace serverTrust];     SecCertificateRef certificate = SecTrustGetCertificateAtIndex(trust, 0);     NSData* ServerCertificateData = (NSData*) SecCertificateCopyData(certificate);     // Check if the certificate returned from the server is identical to the saved certificate in     // the main bundle     BOOL areCertificatesEqual = ([ServerCertificateData                                    isEqualToData:[ MyClass getCertificate ]]);     [ServerCertificateData release];     if (!areCertificatesEqual)      {           ...

Backend-driven native UIs

Backend-drive native UIs John Sundell  Slide Share Using Back-End Design to Create Customizable Front-End Mobile Experiences By controlling the front end of mobile apps from the back end we can build customized experiences at runtime, creating cleaner interfaces and reducing load times. Nithin Rao UX Magazine The Hub Framework Welcome to the Hub Framework - a toolkit for building native, component-driven UIs on iOS ( no Android support released yet ). It is designed to enable teams of any size to quickly build, tweak and ship new UI features, in either new or existing apps. It also makes it easy to build backend-driven UIs. The Hub Framework has two core concepts - Components & Content Operations. Spotify LeeGo: Build UI without UIView LeeGo is a lightweight Swift framework that helps you decouple & modularise your UI component into small pieces of LEGO style's bricks, to make UI development declarative, configurable and highly reusable. Wang Shen...