It's been around a year to the day since I began to dream of a new framework for Core Data sync. Today, I'm proud to announce that I've tagged the repo, pushed the Podfile, and Ensembles 1.0 is a fact.
It all began with my suite of OS X and iOS study apps, Mental Case, which is responsible for 95% of my indie software business. The last few years have been nothing short of a nightmare, as I've struggled to make the transition from reliable peer-to-peer Wi-Fi sync, to the cloud sync that everyone has come to expect.
Eventually the frustration of wrestling existing solutions — including Apple's own offering — led me to the conclusion that if I wanted it done properly, I was probably going to have to do it myself. And so began work on a project initially dubbed 'Syncophant'.
There were many twists and turns along the way. The project was originally envisaged as a Node.js-backed client-server solution, but moved pretty quickly to a file-based, peer-to-peer architecture, which delivers the flexibility to work with virtually any backend service.
Today, Ensembles is a framework worthy of consideration if you want to add sync to a Core Data app. As you would expect from a 1.0 release, it is robust and stable, and is already shipping in a handful of apps.
But 1.0 releases are often light on features, and Ensembles 1.0 is not the right answer for everyone. In particular, on occasion Ensembles must load the whole data store into memory, in much the same way as Core Data's native model version migration. If your app handles large data sets, it may be wise to wait, or — at the very least — run some exploratory tests. Development on Ensembles 2.0 has already begun, and first in line is performance and constraining memory use.
There has been some recent discussion around sync in mobile apps, with some concluding that developing a web service is the only reasonable approach. But there are no right and wrong answers. What works well for the goals of one developer, will be the wrong answer for another.
Each approach has its pros and cons, and you need to carefully weigh your options. If an Android app is definitely on the cards, you are probably better off with a web service. It'll cost you in extra development time, hosting fees, and sleepless nights, but if you have the ambition to develop a cross platform app, you probably also have a team to back you up.
If you have no immediate plans for cross platform support, and just want to add sync in a reasonably cheap and painless way, Ensembles may fit the bill. You can literally have your app syncing with 20–30 lines of code, and support popular services like iCloud and Dropbox.
And there is also the third way: begin with Ensembles, and graduate later to a web service if your app takes off and you decide you need to expand to other platforms. Ensembles is easy to add, and easy to remove. Test the water with Ensembles, and add web services if you end up with a hit, and can afford the team to support it.