Finally figured out what was happening with NSProgress. When I called programMicro (between the becomeCurrentWithPendingUnitCount and resignCurrent calls) I was preparing the full set of firmware packets as well as creating my child NSProgress instance. Somewhere in that other code there must have been a bunch of other NSProgress instances being created (inside NSArray maybe). As a result these other 223 (one fore each packet created) child NSProgress instances were swamping my 1 NSProgress instance that was supposed to be keeping track of the programming progress.