Since my first iPhone, I’ve never had any issue with its battery life. As long as I get access to the charger by the end of the work day the battery life on the iPhone 2G or 3G have been perfectly adequate. That is until I started working on a project down in Atlanta and my weekly commute now extends to around 6-8 hours, depending on flight delays.
I began looking for battery extender for my iPhone. Initially I wanted a battery extender that can charge the iPhone 3G and 3GS, as well as possibly the Kindle. This means the ability to attach different cables to the battery. Also the ‘green’ side of me wanted a solar charging battery so that it’d be possible to charge the battery up using solar energy alone.
Unfortunately after perusing iLounge’s extensive list of battery extender reviews, it was pretty obvious that there weren’t any battery out there that would satisfy my initial list of requirements. The closest one is the IceTECH Solar i9005. With its large solar panel, large battery capacity (2500 mAh), and large collection of connector tips, it would be ideal. The only issue is it doesn’t currently support the iPhone 3GS, as Apple in its infinite wisdom has changed something with regard to charging on the 3GS.
So the search was back to regular battery extender. There are plenty of options out there but none of them really excite me. At least not at the price they are charging for. That is until I came across MonoPrice’s iPhone backup battery. With a rather large capacity (2200 mAh *) and very affordable price (~$15, depending on quantity purchased), it is perfect.
It arrived two weeks ago and I have so far used it twice. From about 10-15% charge in the iPhone, it would take about two hours to fully charge the phone from the backup battery. During that time, I was able to continue to use the iPhone with podcast playing in the background while online twittering and browsing. The only thing that is annoying is the ‘cyclon’-like blue LEDs in the front which move from left to right during the charging process (both from main to battery, and battery to phone). They are very bright and very distracting while using the phone with the battery attached, especially in a dark backseat of a taxi! To charge the backup battery, simply plug the iPhone cable to the bottom of the battery and charge it just like the phone. Unfortunately the battery does not pass the data through to the phone so you can’t sync with iTunes while charging both the phone and the battery.
But overall, the MonoPrice iPhone backup battery is priced just right and perform as advertised. High recommended if you are looking for a simple backup battery for your iPhone.
* For comparison, iPhone 3G battery capacity is 1150 mAh which means the MonoPrice battery can potentially charge the iPhone from 10-15% charge to full twice!
After a few months of .NET reporting/SSIS development work, I’m back to an iPhone project this week. One enhancement I added yesterday was a better formatted table section title in a UITableView. Before, the section title is either a bunch of unformatted (also incorrectly by locale) dates (e.g. 2009-09-30), or times (e.g. 14:58) straight from the data source. The enhancement/bug fix is to format the date or time to be locale aware so the title would either be “Wed Sep, 30 2009” or “2:58 PM” if you are in the US.
Pretty straightforward I thought, and after a couple of trips to
NSDateFormatter and use the output in UITableView’s
titleForHeaderInSection:section method, it was all working very well in the simulator. That was until I put the app onto my iPhone for some real in-device testing.
The scrolling performance in the table was horrible! My first thought was that it had to do with the background view I added to the custom table cell view for colouring the table cell background. But after nearly an hour of debugging through the code I still couldn’t find anything wrong.
Turns out that the
titleForHeaderInSection:section method is not just called once per controller instantiation. It is called once per table cell display!
Once I moved the code to format the section title into
viewDidLoad and cached a copy of the nicely formatted titles in an array, the scrolling is back to normal speed.
One of the two iPhone app that I worked on during earlier part of this year has landed on iTunes AppStore! As part of the sponsor for Agile 2009 conference, a small team of ThoughtWorkers developed a conference app to help the attendees. I left my fingerprints on the Twitter, Maps, and Schedule screens. The other interesting parts include the cloud computing (on Google App Engine) that provides up-to-date sync of conference schedules, ability to mark sessions that you plan to attend, and provide feedback to the presenters. The app also includes the Agile Manifesto, the 12 principles, allows you to sign the manifesto, or even send email to your friends to sign up.
I started learning Objective-C when Apple released the iPhone SDK over a year ago, and started programming in it seriously at the beginning of this year. While there are many things I like about Objective-C as a OO language, there is one thing that continuously bother me.
One of the four main tenant of object-oriented design is Encapsulation. Meaning, the inner working of an object is hidden from public view.
In Objective-C, an instance method can be declared in the implementation file (.m file) in the following ways:
- Implement the method without declaring it in the header file. This is (almost) equivalent to private method in C#/Java.
- Declare the method signature in the header file, and implement the method in the .m file. This is like declaring a method public in C#/Java.
So how does this discourages me from writing good OO code with respect to encapsulation?
If I choose the first option, I have two choices. Either I implement the method before its first usage which does no good with readability re Uncle Bob’s Clean Code‘s newspaper metaphor, OR implement it after and put up with the compiler warning about the method call may not exist.
To get the freedom of placing the method anywhere in the .m file, I have to choose the second option and declare the method signature in the header file. The downside of this is that now the method is exposed as part of the class public interface and break encapsulation. (Yes, I know that the method can still be called without the header file declaration. Again, a compiler warning greets you.)
All three options are undesirable to me. It is really a case of pick my poison! Right now, I choose option one and put the method before first usage. Readability suffers because I like reading methods after the usage but at least the header file is clean and represents the intended public interface.
Update: Martin Pilkington makes a suggestion to me via Twitter. I’ll have to try it out and see.
Update #2: Someone else on Twitter also suggests using Extension to solve this issue. The Apple’s documentation here (at the end of the page) shows how an extension of a class can be used to define private method, separated from the main class interface definition.
My initial feel? Pretty inelegant workaround to an inherited problem of Objective-C legacy linkage to C. No thanks, I’ll stick with declaring private methods before usage.