if you dispatch archive and then call flush (outside of the dispatch block), the order will be correct. the dispatch calls here and inside -flush will be called in order from the calling thread and the two resulting blocks on the serial queue will ultimately be run in order (because it's a serial queue, it executes one task at a time, in order)