Interesting approach. I like the idea of letting controllers have control, I very much agree with that. Only thing I would point out as probably not true anymore is “But Core Data is difficult to use properly in a multi-threaded application”… I would have agreed with that statement before Core Data block api (before performBlok and performBlockAndWait) was available. Now Core Data is quite easy to use in a multithreaded environment, so, I really don’t understand what is hard about Core Data in a multithreaded environment anymore. Also, really, you use the same concept using performSync and performAsync so, really, I am not sure how this approach is different than performBlock and performBlockAndWait conecptually. Core Data is now quite easy to use, so, I wouldn’t really switch to this solution because of Core Data, but, I do think Swift demands some new framework that allows direct interaction with SQLite, I find this an interesting candidate.
Again, overall I like the approach, will give this a try, very similar to what I have built on the side a few months ago to deal with SQLite on my iOS applications. Good job.