I hope this question isn’t too general/ambiguous…
I’m writing an iphone quiz game app and am having trouble figuring out the best way to handle data. Currently I am thinking of having a single Model class that holds an array of “User” classes which each have an array of user-specific “Question” classes. I’d like to be able to access the overarching Model from any of my view controllers, but that means I’ll probably have to pass the model object to any new view controller, use a singleton, or do something else. What is the best way to access my Model object from other classes? Another factor I’m not sure about is being able to save the data – would I have to use Core Data/SQLite to save my single Model object, or is there a simpler way?
I’d start by designing a schema using CoreData. IMO, its best to start out using CoreData because then you’ll never have to convert your data layer to CoreData, in the event that your app scales beyond a simple object or two.
The other route would be to create a web service that returns your data… so you just call the service and it returns a collection of user objects. You can either send down the entire object graph with the questions, or create another service to return a collection of questions for a specific user. If you have a web server handy, this method scales the best because you don’t have to rely on app updates to get new questions into your system. I would still use CoreData to cache the results… so that way you’re not downloading the same information all the time.
So when it comes to accessing CoreData objects, I use a repository class that’s a singleton. This makes it easy for any view controller to grab an instance of the repository and get some data. Here’s what something like that might look like;
There’s a lot of redundant code to fetch data so wrapping that up in an object will help get all that nasty code, like predicates and sorting, out of your view controllers. You can see where I leverage a va_list in the where clause so I can inject that string right into my predicate. Here are some other methods you could implement:
I’m not sure if this is the preferred way, but I’ve had a lot of success with this method. Hope this helps!