Swipe Conference 2012
Jon from Secret Lab presenting at Swipe Conference 2012
Jon from Secret Lab presenting at Swipe Conference 2012

Last week in Sydney was the second ever Swipe Conference –– an Australian iOS and OS X developer event. Secret Lab was again in attendance and, as always, the Apple developer community was great fun to hang out with and learn from –– and the organisers, Jake MacMullin, Mark Aufflick and Sean Woodhouse really put on a fantastic event. We were also again fortunate enough to have a chance to contribute to the conference (Paris spoke at the first ever Swipe Conference, in Melbourne last year), with Jon presenting Cocos2D for Fun and Profit, a quick guide to the Cocos2D graphics library. Designed as a fast introduction to this time-saving library, this talk leads the audience from a minimal starting point to a full game.

We're incredibly fond of Cocos2D, as it provides a very nice middle option for people who want more power than what UIKit can provide, but don't want to deal with the.. joy that is OpenGL. With Cocos2D, it's straightforward to create a scene comprising a number of quads, and even more trivial to animate these quads in useful ways.

We've uploaded the code and slides to GitHub and Speakerdeck, and encourage you to take a look! We had a number of people approach us after the talk and mention that they were now interested in making games with this library, so hooray, we're sharing the love!

We also took a lot of photos at Swipe Conference –– you can find them on Flickr.

PyCon Australia 2012

PyCon AustraliaThis month we were lucky enough to sponsor and attend PyCon Australia, hosted (for the first time) in our hometown of Hobart! PyCon Australia is the national conference for users of the Python programming language. This was the third year that PyCon Australia has run since being founded in Sydney. We greatly enjoyed meeting members of the Australian and international Python communities, hearing their stories, tips and interests. All the sessions we attended were fabulous, but amongst the many highlights were:

  • CodeWars – entertaining programming-as-a-spectator-sport problem solving to kick the conference off. Hosted and designed by our talented friends Tony and Josh, respectively. A great place to spot some amazing nerd gear!
  • What to build. How to build it. – the first keynote, presented by Mark Ramm, took us on an entertaining romp through the idea of applying experimental methodologies to product design. Great stuff!
  • Virtual robotic car racing with Python and TORCS – Python and virtual robot cars! What's not to like?
  • Python for Humans – the second keynote, presented by Kenneth Reitz, was a thorough and useful discussion of making Python more user (programmer) friendly. Exactly the sort of stuff that should be a keynote!
  • Lightning Talks – we always love lightning talks, and these were no exception. Lots of quick talks, mostly useful, and highly entertaining!

PyCon Australia Coffee –– blended and served by Ritual Coffee Tasmania, sponsored by Secret LabWe also thoroughly enjoyed the dinner (a cruise to Peppermint Bay, followed by a fabulous meal and cruise back to Hobart!) as well as the coffee (which was a tasty blend called "African Swallow", designed specifically for PyCon Australia by Ritual Coffee). The coffee for all attendees was sponsored by Secret Lab, and we were proud to have our logo on every cup. The attendees all really seemed to enjoy the coffee, and we're very proud to have been involved in a small way in the running of such an excellent conference in Tasmania. PyCon Australia returns to Hobart next year as part of their 2-year cycle. We can't wait!

Secret Lab's coffee sponsorship of PyCon Australia 2012

You can find the rest of our photos from PyCon Australia 2012 on Flickr and the videos from PyCon on YouTube. Congratulations to our friend, and frequent collaborator, Chris on the meticulous organisation he and his team undertook to bring us PyCon Australia!

Science Week (Tasmania)

We're very pleased to announce the availability of the official iPhone app for the Tasmanian events of the National Science Week 2012 festival. National Science Week is Australia's largest national festival and includes hundreds of events held all over Australia. National Science Week 2012 Tasmanian Events –– iPhone app

The app features:

  • full program of National Science Week events in Tasmania
  • day by day Event Calendar
  • maps showing the location of events
  • search by region or current location
  • automatic schedule updates

Grab the app on the iTunes App Store, and please let us know what you think!

Using JSON to load Objective-C objects

You want to write an iOS or OS X app that quickly and easily retrieves some data from a server and converts it to an Objective-C class. Also, you want to write the server using something standard, like Django or Ruby on Rails.

The standard way that you’d do this would be using NSCoder, where your client application would receive the data and you’d unpack it like so:

However, the file format for serialised objects is internal to iOS and OS X, and is also a binary format that’s very difficult to read while in transit.

We recently had a similar problem, where we wanted to have our server send data in JSON format, which we like because JSON’s pretty human-readable. We could implement our own custom implementation of NSCoder, but we were after a more lightweight solution.

Key-value coding

This is where key-value coding comes in. Key-value coding is a feature of Cocoa that lets you access properties and instance variables of class at runtime by name, rather than simply at compile time.

For example, if you had a class that had an NSString property called “name”, you could access it like this:

Or you could access it with key-value coding, like this:

Likewise, you can set the name property like this:

But you could also set it using key-value coding, like this:

The advantage of key-value coding is that you can generate the keys at run-time. Your code doesn’t have to know about the properties and variables kept inside an object in order to attempt to get and set the values.

This is where our lightweight serialisation comes in. Let’s say that we’ve received some JSON data that looks like this:

In this example, we’ve also got an Objective-C object that has matching properties:

Converting the JSON data into a dictionary is pretty easy.

You can then create the Objective-C class from this dictionary by creating a new Employee object, and then iterating over each of the keys in the dictionary, using setValue:forKey: to set the values.

This works even for non-object properties like Employee’s income property, which is an int. In this case, the dictionary loaded from the JSON contains an NSNumber object for the income field; when setValue:forKey: is used for that key, it automatically extracts the int from the NSNumber and applies it to the class.

There’s an even easier way to set all of the values:

Loading objects when you don’t know the class

Another possible use case is one where you receive a chunk of JSON, but you don’t know ahead of time what kind of object the JSON should be turned into. This is where NSClassFromString comes in handy.

If your JSON object contains a field called, say, class, you can use that to create the empty object. Like so:

The reason we use NSObject in the above example is because all NSObjects support the key-value coding methods. Even though loadedObject is treated as a generic NSObject, the fact that it was created with whatever class ObjectClass is determined to be means that the object will be what you specify.

Dangers and Caveats

This technique only applies for simple properties, like strings and numbers. More complex data types or references to other Objective-C objects need to be handled differently.

If you use setValue:forKey: on a key that doesn’t exist in the target object, the object will throw an exception and crash. There are a couple of ways you can handle this; one is to implement the setValue:forUndefinedKey: method in your classes.

This method is called when you try to set a value for a property or instance variable that doesn’t exist. The default implementation throws an exception and crashes; you can implement your own that leaves a warning, for example.

A final note: this is a very quick-and-dirty solution. If you want more reliable behaviour, you’ll need to add more checks and validation code. For simply loading objects, it works pretty well.